Greenplum備份恢復工具gpbackup主題(上)- 簡介與源碼編譯

1.寫在前面

最近社區的小夥伴一直在問gpbackup的問題,問了幾個研發的朋友有些問題大家也都不是很清楚,今天索性看了看源碼,整理一個gpbackup的主題分享給大家,希望能夠幫到大家。

gpbackup的分享主題計劃分成3部分:

  • gpbackup簡介與源碼編譯
  • gpbackup詳細使用方法
  • gprestore詳細使用方法及總結

那麼這篇文章,我們首先來介紹一下gpbackup,然後從github上拉取源碼進行編譯。

2.gpbackup簡介

Greenplum是MPP架構的分析型數據庫,其核心源碼從2015年的v4.3版本開始開源至今,已經有6年多的時間了,起初,開源版本的並行備份恢復工具叫gpcrondumpgpdbrestore。由於這個工具存在一些已知的缺陷,比如單獨備份一個大壓縮包導致單表恢復操作時間過長等,官方目前已經開發了替代工具gpbackupgprestore並進行了開源,GitHub地址爲:https://github.com/greenplum-db/gpbackup

已知gpbackup和gprestore適配的Greenplum版本如下:

參考自淼哥的《Greenplum-Database管理員指南6.2》,在此對作者的分享表示感謝,大家也可以學習該文檔的“並行備份gpbackup與gprestore”部分,瞭解更多的相關內容。

  • GPDB 4.3.22及以後版本
  • GPDB 5.5.0及以後版本
  • GPDB 6.0.0及以後版本

這裏對各個版本的備份工具做一下總結:

  • GPDB 4.x/5.x的某些版本(具體版本參考上面),可以同時使用gpcrondump和gpbackup兩種工具;
  • GPDB 6.x版本開始,gpcrondump已經去掉了,只能使用gpbackup工具;
  • GPDB 6.x版本開始,官方版本的gpbackup提供單獨的安裝包,需要自行從vmware tanzu下載使用;開源版本的gpbackup可以從GitHub Relaese上下載發佈包,或者自己進行源碼編譯。

3.gpbackup源碼編譯

gpbackup是基於Golang寫的,已經有很多網友在網上做了源碼分析,這裏再絮叨一下源碼編譯的過程吧,方便大家有一個整體的認識。

3.1 Golang環境配置

因爲gpbackup是基於golang開發的,所以首先要配置golang基礎開發環境,這裏大家要注意,因爲golang可以直接編譯跨平臺的包,所以你可以選擇在Mac上交叉編譯Linux系統用的包,只需要指定不同的編譯標籤(編譯部分再詳細介紹)。

1)安裝Golang

大家首先從 https://golang.google.cn/dl/ 下載準備用於編譯gpbackup的操作系統對應的軟件包,整個Linux的安裝包是通用的,只需要分清楚CPU架構是ARM還是X86即可。

下載完成後,需要自己進行安裝,通常安裝在對應操作系統的默認軟件位置,比如這裏我安裝在/usr/local/go。這個路徑,就是所謂的GOROOT。

安裝完成後,需要配置三個環境變量:

# .zshrc add for golang
export GOROOT=/usr/local/go
export GOPATH=/home/chris/go
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin

環境變量配置完成後,在命令行執行如下命令,如果顯示正常,說明配置有效:

$ source ~/.zshrc
$ go version
go version go1.17.4 linux/amd64

2)在GOPATH下創建相應的文件夾

$ mkdir -p go/src go/bin go/pkg

3.2 gpbackup源代碼下載編譯

1)下載源代碼

源代碼的下載方式有兩種,第一種是參考官方的指導使用go get,第二種是直接git把代碼拉下來。

第一種:執行如下命令下載源代碼:

$ go get github.com/greenplum-db/gpbackup/...
# 注意這裏的三個點不能省略,三個點意思是將gpbackup下的所有子目錄都做完整下載

這種方式拉下來的源代碼,我這邊的位置有點奇怪,僅供參考:

$ pwd
/Users/chris/Go/pkg/mod/github.com/greenplum-db/[email protected]

第二種:執行如下命令下載源代碼:

$ git clone https://github.com/greenplum-db/gpbackup.git

以上兩種方式可以任選一種,我們習慣性的使用git去clone源代碼,並且這種方式可以明確的獲知源代碼的下載位置,我個人感覺更好一些; 另外雖然在golang裏面,使用go mod方式管理依賴時,不再需要GOPATH,但是在gpbackup裏,GOPATH這個環境變量是必選項,不可以省略,因爲最終打包好的文件會放到$GOPATH/bin下面。

2)編譯

$ make depend
$ make build
# 如果沒有定義GOPATH,會報如下錯誤:
Makefile:4: *** Environment variable GOPATH is not set.  Stop.

交叉編譯的選項如下:

make build_linux # Mac上交叉編譯Linux包

最後你從$GOPATH/bin/下面會找到如下三個包:

gpbackup
gprestore
gpbackup_helper

便已完成後,執行如下命令安裝即可(或者手工copy):

$ make install
cp /home/gpadmin/go//bin/gpbackup /home/gpadmin/go//bin/gprestore /usr/local/greenplum-db-6.15.0/bin

4.gpbackup使用示例

在本節的最後部分,通過一個簡單的例子,帶大家看一下如何使用gpbackup。

直接執行命令gpbackup --dbname postgres :

$ ./gpbackup --dbname postgres
20211225:20:52:26 gpbackup:gpadmin:allinone:026818-[INFO]:-gpbackup version = 1.23.0+dev.5.g9950492
20211225:20:52:26 gpbackup:gpadmin:allinone:026818-[INFO]:-Greenplum Database Version = 6.15.0 build commit:4e6288c9e9fca634b007a978fba3ce25aae26aed Open Source
20211225:20:52:26 gpbackup:gpadmin:allinone:026818-[INFO]:-Starting backup of database postgres
20211225:20:52:26 gpbackup:gpadmin:allinone:026818-[INFO]:-Backup Timestamp = 20211225205226
20211225:20:52:26 gpbackup:gpadmin:allinone:026818-[INFO]:-Backup Database = postgres
20211225:20:52:26 gpbackup:gpadmin:allinone:026818-[INFO]:-Gathering table state information
20211225:20:52:26 gpbackup:gpadmin:allinone:026818-[INFO]:-Acquiring ACCESS SHARE locks on tables
Locks acquired:  6 / 6 [================================================================] 100.00% 0s
20211225:20:52:26 gpbackup:gpadmin:allinone:026818-[INFO]:-Gathering additional table metadata
20211225:20:52:26 gpbackup:gpadmin:allinone:026818-[INFO]:-Getting partition definitions
20211225:20:52:26 gpbackup:gpadmin:allinone:026818-[INFO]:-Getting storage information
20211225:20:52:26 gpbackup:gpadmin:allinone:026818-[INFO]:-Getting child partitions with altered schema
20211225:20:52:26 gpbackup:gpadmin:allinone:026818-[INFO]:-Metadata will be written to /data/gpdata/master/gpdb-1/backups/20211225/20211225205226/gpbackup_20211225205226_metadata.sql
20211225:20:52:26 gpbackup:gpadmin:allinone:026818-[INFO]:-Writing global database metadata
20211225:20:52:26 gpbackup:gpadmin:allinone:026818-[INFO]:-Global database metadata backup complete
20211225:20:52:26 gpbackup:gpadmin:allinone:026818-[INFO]:-Writing pre-data metadata
20211225:20:52:26 gpbackup:gpadmin:allinone:026818-[INFO]:-Pre-data metadata metadata backup complete
20211225:20:52:26 gpbackup:gpadmin:allinone:026818-[INFO]:-Writing post-data metadata
20211225:20:52:26 gpbackup:gpadmin:allinone:026818-[INFO]:-Post-data metadata backup complete
20211225:20:52:26 gpbackup:gpadmin:allinone:026818-[INFO]:-Writing data to file
Tables backed up:  6 / 6 [==============================================================] 100.00% 0s
20211225:20:52:26 gpbackup:gpadmin:allinone:026818-[INFO]:-Data backup complete
20211225:20:52:27 gpbackup:gpadmin:allinone:026818-[INFO]:-Found neither /usr/local/greenplum-db-6.15.0/bin/gp_email_contacts.yaml nor /home/gpadmin/gp_email_contacts.yaml
20211225:20:52:27 gpbackup:gpadmin:allinone:026818-[INFO]:-Email containing gpbackup report /data/gpdata/master/gpdb-1/backups/20211225/20211225205226/gpbackup_20211225205226_report will not be sent
20211225:20:52:27 gpbackup:gpadmin:allinone:026818-[INFO]:-Backup completed successfully

因授權導致的錯誤

如果你在執行備份命令時出現以下錯誤,可能跟pg_hba.conf文件中的訪問授權有關:

$ gpbackup --dbname postgres
20211225:20:50:23 gpbackup:gpadmin:allinone:026386-[INFO]:-gpbackup version = 1.23.0+dev.5.g9950492
20211225:20:50:23 gpbackup:gpadmin:allinone:026386-[CRITICAL]:-failed to connect to `host=allinone user=gpadmin database=postgres`: server error (FATAL: password authentication failed for user "gpadmin" (SQLSTATE 28P01)) (allinone:5432)

從以上錯誤中可以看出,gpbackup在連接到數據庫時,採用的是pqx的connection url的方式,該報錯是因爲pg_hba.conf文件中對allinone這個主機的gpadmin用戶訪問做了密碼限制,可以把密碼限制放開,改爲trust即可。

如果生產必須要求所有的IP(除了socket外)均需要密碼驗證,那麼請在執行gpbackup之前配置環境變量PGPASSWORD,如下:

$ export PGPASSWORD=passwd123
$ gpbackup --dbname postgres

gpbackup支持從以下環境變量中取值:

  • PGHOST
  • PGPORT
  • PGUSER
  • PGPASSWORD
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章