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/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

关注微信公众号

VMware 中国研发中心