1.写在前面
最近社区的小伙伴一直在问gpbackup 的问题,问了几个研发的朋友有些问题大家也都不是很清楚,今天索性看了看源码,整理一个gpbackup 的主题分享给大家,希望能够帮到大家。
gpbackup 的分享主题计划分成3部分:
- gpbackup简介与源码编译
- gpbackup详细使用方法
- gprestore详细使用方法及总结
那么这篇文章,我们首先来介绍一下gpbackup ,然后从github上拉取源码进行编译。
2.gpbackup简介
Greenplum是MPP架构的分析型数据库,其核心源码从2015年的v4.3版本开始开源至今,已经有6年多的时间了,起初,开源版本的并行备份恢复工具叫gpcrondump 和gpdbrestore 。由于这个工具存在一些已知的缺陷,比如单独备份一个大压缩包导致单表恢复操作时间过长等,官方目前已经开发了替代工具gpbackup 和gprestore 并进行了开源,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/gpbackup@v0.0.0-20211208190753-99504926b0d3
第二种:执行如下命令下载源代码:
$ 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
|