Greenplum备份恢复工具gpbackup——参数

在《Greenplum备份恢复工具gpbackup》系列文章的上篇中,我们简单介绍了gpbackup,并进行了源码编译。在今天的《中篇》中,我们将介绍gpbackup 所有参数的详细使用方法。

本篇文章将参考以下内容进行操作:

  • GPDB6.20DDocs – 官方英文文档的gpbackup 部分;
  • gpbackup 命令帮助信息

注意:gpbackup 和 gprestore 命令只需要放置到 master 节点的 greenplum-db/bin 目录下,gpbackup_helper 命令需要放置到所有 segment host 节点的 greenplum-db/bin 目录下。

1 gpbackup备份参数详解

首先我们通过命令行来看一下gpbackup命令自带的帮助信息有哪些参数,具体含义就直接在参数后面进行翻译了哈:

[chris@gpt1 ~]$ gpbackup --help
gpbackup is the parallel backup utility for Greenplum

Usage:
  gpbackup [flags]

Flags:
      --backup-dir string            `可选参数`, 写入备份文件的绝对路径,不能采用相对路径,如果您指定了该路径,备份操作会将所有备份文件(包括元数据文件)都放到这个目录下。如果您不指定这个选项,元数据文件会保存到Master节点的 `$MASTER_DATA_DIRECTORY/backups/YYYYMMDD/YYYYMMDDhhmmss/` 目录下,数据文件会存放在segment主机的 `<seg_dir>/backups/YYYYMMDD/ YYYYMMDDhhmmss/`目录下。该选项不能与 `--plugin-config` 选项共同使用。
      --compression-level int        `可选参数`, 压缩级别。大家需要注意,在当前随GPDB版本发布的gpbackup包中,只支持gzip压缩格式,如果您自行编译gpbackup,可以看到已经增加了 `compression-type` 类型,该类型支持其他的压缩类型。压缩级别的默认值为1,gpbackup在备份时,会默认启用gzip压缩。
      --compression-type string      `可选参数`, 压缩类型。有效值有 'gzip','zstd',默认为 'gzip',如果要使用 'zstd' 压缩,需要在所有服务器上安装该压缩类型以保证shell可以执行 `zstd` 命令,安装方式参考:https://github.com/facebook/zstd 。
      --copy-queue-size int          `可选参数`, 自行编译最新版本gpbackup带有的参数,该参数只能配合 `--single-data-file` 参数一起使用,当定义了 `--single-data-file` 参数以后,通过执行 `--copy-queue-size` 参数的值来指定gpbackup命令使用COPY命令的个数,默认值为1。
      --data-only                    `可选参数`, 只备份数据,不备份元数据。
      --dbname string                `必选参数`, 只要进行备份的数据库名称,必须指定,否则会报错,备份无法进行。
      --debug                        `可选参数`, 显示备份过程中详细的debug信息,通常用在排错场景。
      --exclude-schema stringArray   `可选参数`, 指定备份操作要排除的数据库模式(schema), 如果要排除多个模式,需要多次定义,不支持 `--exclude-schema=schema1,schema2` 的方式。另外该参数与 '--exclude-schema-file, exclude-table, --exclude-table-file, --include-schema, --include-schema-file, --include-table, --include-table-file' 这几个参数不能同时使用。
      --exclude-schema-file string   `可选参数`, 包含备份操作要排除的数据库模式的文件,每一行为一个模式名,该文件不能包含多余的符号,如果数据库中的模式包含除了:字母、数字和下划线以外的特殊符号,那么请在文件中用双引号进行包裹。该参数与 '--exclude-schema, --exclude-table, --exclude-table-file, --include-schema, --include-schema-file, --include-table, --include-table-file' 这几个参数不能同时使用。
      --exclude-table stringArray    `可选参数`, 指定备份操作中要排除的表名,该参数与 '--exclude-schema, --exclude-schema-file, --exclude-table-file, --include-schema, --include-schema-file, --include-table, --include-table-file' 这几个参数不能同时使用。指定表名时,必须使用 `<schema-name>.<table-name>` 的格式指定匹配到具体的模式,如果数据库中的模式包含除了:字母、数字和下划线以外的特殊符号,那么请在文件中用双引号进行包裹。另外该参数也支持多次指定。
      --exclude-table-file string    `可选参数`, 指定文件包含备份操作中要排除的表名,该参数与 '--exclude-schema, --exclude-schema-file, --exclude-table, --include-schema, --include-schema-file, --include-table, --include-table-file' 这几个参数不能同时使用。指定表名时,必须使用 `<schema-name>.<table-name>` 的格式指定匹配到具体的模式,如果数据库中的模式包含除了:字母、数字和下划线以外的特殊符号,那么请在文件中用双引号进行包裹。如果有多个表,需要在文件中分行多次指定。
      --from-timestamp string        `可选参数`, 指定增量备份的时间戳。被指定的备份必须有增量备份集,如果没有,备份操作会自动创建一个增量备份集;如果被指定的备份是一个增量备份,则备份操作会向备份集增加一个备份。使用该参数时,必须指定参数 `--leaf-partition-data`, 并且不能与`--data-only或--metadata-only`参数一起使用。如果没有任何全量备份存在,则会报错退出备份过程。
      --help                         显示命令行参数帮助信息。
      --include-schema stringArray   `可选参数`, 指定备份操作要包含的数据库模式(schema), 如果要包含多个模式,需要多次定义,不支持 `--include-schema=schema1,schema2` 的方式。另外该参数与 '--exclude-schema, --exclude-schema-file, exclude-table, --exclude-table-file, --include-schema-file, --include-table, --include-table-file' 这几个参数不能同时使用。
      --include-schema-file string   `可选参数`, 包含备份操作要包含的数据库模式的文件,每一行为一个模式名,该文件不能包含多余的符号,如果数据库中的模式包含除了:字母、数字和下划线以外的特殊符号,那么请在文件中用双引号进行包裹。该参数与 '--exclude-schema, --exclude-schema-file, --exclude-table, --exclude-table-file, --include-schema, --include-table, --include-table-file' 这几个参数不能同时使用。
      --include-table stringArray    `可选参数`, 指定备份操作中要包含的表名,该参数与 '--exclude-schema, --exclude-schema-file, --exclude-table, --exclude-table-file, --include-schema, --include-schema-file, --include-table-file' 这几个参数不能同时使用。指定表名时,必须使用 `<schema-name>.<table-name>` 的格式指定匹配到具体的模式,如果数据库中的模式包含除了:字母、数字和下划线以外的特殊符号,那么请在文件中用双引号进行包裹。另外该参数也支持多次指定。
      --include-table-file string    `可选参数`, 指定文件包含备份操作中要包含的表名,该参数与 '--exclude-schema, --exclude-schema-file, --exclude-table, --exclude-table-file, --include-schema, --include-schema-file, --include-table' 这几个参数不能同时使用。指定表名时,必须使用 `<schema-name>.<table-name>` 的格式指定匹配到具体的模式,如果数据库中的模式包含除了:字母、数字和下划线以外的特殊符号,那么请在文件中用双引号进行包裹。如果有多个表,需要在文件中分行多次指定。
      --incremental                  `可选参数`, 增量备份功能,增量备份只支持AO表的增量,Heap表不支持增量备份。指定该选项后,会在备份集合中继续增加增量备份。在GPDB里面,备份可以全部都由全量备份构成,也可以由全量备份+增量备份的方式构成,增量备份必须与前面的全量备份组成一个连续的集合,否则无法进行恢复。如果已经做了一个全量备份但是没有增量备份,那该参数会在备份时创建一个增量备份集;如果全量和增量都已经存在了,那么该参数会在现有增量备份集中增加一个最新的备份;另外也可以通过指定 '--from-timestamp' 参数来改变默认行为。
      --jobs int                     `可选参数`, 指定进行表备份过程中的并行任务数,如果不指定,该值默认为1,gpbackup会使用一个任务(即一个数据库连接)进行备份。可以通过增加该值来提升备份速度,如果指定了大于1的值,备份操作会以表为单位进行并发操作,每个表开启一个单独的事务。需要特别注意的是,指定该参数进行并发备份时,不要进行外部程序操作,否则无法保证多表之间的事物一致性。该参数可以与 `--metadata-only, -- single-data-file, --plugin-config` 参数共同使用。
      --leaf-partition-data          `可选参数`, 为分区表的每一个叶子节点单独创建备份文件,而不是为整个表创建一个备份文件(默认)。使用该参数配合 `--include-table, -- include-table-file, --exclude-table, --exclude-table-file` 参数可以实现包含或排除叶子节点数据的操作。
      --metadata-only                `可选参数`, 仅备份元数据(即创建数据库对象的DDL语句),不备份任何实际的生产表数据。
      --no-compression               `可选参数`, 不启用压缩。
      --plugin-config string         `可选参数`, 指定plugin配置文件位置,该文件是一个有效的YAML文件,用来指定在备份过程中使用的plugin应用的配置信息。由于备份的plugin通常都是为了将备份放到远程存储,所以该选项不能与 `--backup-dir` 同时使用;例如可以使用s3的库将备份文件放到亚马逊S3存储上。也可以通过开放接口自己编写plugin,具体可以参考:https://gpdb.docs.pivotal.io/6-17/admin_guide/managing/backup-plugins.html
      --quiet                        `可选参数`, 静默模式,除了warning和error信息都不打印。
      --single-data-file             `可选参数`, 每个segment的数据备份成一个未见,而不是每个表备份一个文件(默认)。如果指定了该选项,在使用gprestore恢复的时候,不能使用 `--job` 选项进行并发恢复。需要特别注意,如果要使用该参数,需要配合 `gpbackup_helper` 命令一起使用,该命令与gpbackup和gpresotre一起编译生成,需要把这个命令放到所有segment host的greenplum-db/bin目录下。
      --verbose                      `可选参数`, 打印详细日志信息。
      --version                      打印gpbackup的版本号并退出。
      --with-stats                   `可选参数`, 备份查询计划统计信息。
      --without-globals              `可选参数`, 不备份全局对象。

从上面各个参数的详细解释中,大家也可以得出一个总结,gpbackup 的必选参数只有 –dbname,其他参数均为可选参数,有些参数之间是存在互斥关系的,大家在使用过程中一定要注意。

2、gpbackup备份实验及总结

在上面一部分,进行了详细的参数解释,下面我们通过一系列的实验来对一些特别的参数和场景进行演示。因为参数过多,不能一一列举,所以尽可能选用一些大家常用的场景,场景之间可能存在顺序关联关系,还请各位依次阅读。

2.1 常规备份,只指定–dbname参数 

通过该试验让大家认识gpbackup备份操作生成的各类文件的内容及作用,方便大家对备份有一个整体的了解。

实验语句:

[chris@gpt1 ~]$ gpbackup --dbname=db3
20220401:17:43:46 gpbackup:chris:gpt1:004385-[INFO]:-gpbackup version = 1.23.0+dev.6.gabcfe15
20220401:17:43:46 gpbackup:chris:gpt1:004385-[INFO]:-Greenplum Database Version = 6.15.0 build commit:4e6288c9e9fca634b007a978fba3ce25aae26aed
20220401:17:43:46 gpbackup:chris:gpt1:004385-[INFO]:-Starting backup of database db3
20220401:17:43:46 gpbackup:chris:gpt1:004385-[INFO]:-Backup Timestamp = 20220401174346
20220401:17:43:46 gpbackup:chris:gpt1:004385-[INFO]:-Backup Database = db3
20220401:17:43:46 gpbackup:chris:gpt1:004385-[INFO]:-Gathering table state information
20220401:17:43:46 gpbackup:chris:gpt1:004385-[INFO]:-Acquiring ACCESS SHARE locks on tables
Locks acquired:  2 / 2 [================================================================] 100.00% 0s
20220401:17:43:46 gpbackup:chris:gpt1:004385-[INFO]:-Gathering additional table metadata
20220401:17:43:46 gpbackup:chris:gpt1:004385-[INFO]:-Getting partition definitions
20220401:17:43:46 gpbackup:chris:gpt1:004385-[INFO]:-Getting storage information
20220401:17:43:46 gpbackup:chris:gpt1:004385-[INFO]:-Getting child partitions with altered schema
20220401:17:43:46 gpbackup:chris:gpt1:004385-[INFO]:-Metadata will be written to /data/master/gp-1/backups/20220401/20220401174346/gpbackup_20220401174346_metadata.sql
20220401:17:43:46 gpbackup:chris:gpt1:004385-[INFO]:-Writing global database metadata
20220401:17:43:46 gpbackup:chris:gpt1:004385-[INFO]:-Global database metadata backup complete
20220401:17:43:46 gpbackup:chris:gpt1:004385-[INFO]:-Writing pre-data metadata
20220401:17:43:47 gpbackup:chris:gpt1:004385-[INFO]:-Pre-data metadata metadata backup complete
20220401:17:43:47 gpbackup:chris:gpt1:004385-[INFO]:-Writing post-data metadata
20220401:17:43:47 gpbackup:chris:gpt1:004385-[INFO]:-Post-data metadata backup complete
20220401:17:43:47 gpbackup:chris:gpt1:004385-[INFO]:-Writing data to file
Tables backed up:  2 / 2 [==============================================================] 100.00% 0s
20220401:17:43:47 gpbackup:chris:gpt1:004385-[INFO]:-Data backup complete
20220401:17:43:48 gpbackup:chris:gpt1:004385-[INFO]:-Found neither /usr/local/greenplum-db-6.15.0/bin/gp_email_contacts.yaml nor /home/chris/gp_email_contacts.yaml
20220401:17:43:48 gpbackup:chris:gpt1:004385-[INFO]:-Email containing gpbackup report /data/master/gp-1/backups/20220401/20220401174346/gpbackup_20220401174346_report will not be sent
20220401:17:43:48 gpbackup:chris:gpt1:004385-[INFO]:-Backup completed successfully

实验总结:

如果只指定数据库名称,会将这个数据库的所有对象都进行备份,例如:元数据、表数据、资源队列、资源组、角色等。

元数据存储在Master节点的

$MASTER_DATA_DIRECTORY/backups/YYYYMMDD/YYYYMMDDhhmmss/

目录下,会生成4个文件,其中:config.yaml 记录gpbackup 运行时的参数配置项;report记录备份下来的数据库对象信息,主要是对象数量;toc.yaml 记录元数据之间的依赖关系;metadata.sql 记录表结构DDL的详细信息。

Master节点生成的四个文件:

[chris@gpt1 20220401174346]$ ll总用量 16-r--r--r--. 1 chris chris  725 4月   1 17:43 gpbackup_20220401174346_config.yaml-r--r--r--. 1 chris chris 2313 4月   1 17:43 gpbackup_20220401174346_metadata.sql-r--r--r--. 1 chris chris 1786 4月   1 17:43 gpbackup_20220401174346_report-r--r--r--. 1 chris chris 4070 4月   1 17:43 gpbackup_20220401174346_toc.yaml

config.yaml文件内容展示:

[chris@gpt1 20220401174346]$ cat gpbackup_20220401174346_config.yamlbackupdir: ""backupversion: 1.23.0+dev.6.gabcfe15compressed: truecompressiontype: gzipdatabasename: db3databaseversion: 6.15.0 build commit:4e6288c9e9fca634b007a978fba3ce25aae26aeddataonly: falsedatedeleted: ""excluderelations: []excludeschemafiltered: falseexcludeschemas: []excludetablefiltered: falseincluderelations: []includeschemafiltered: falseincludeschemas: []includetablefiltered: falseincremental: falseleafpartitiondata: falsemetadataonly: falseplugin: ""pluginversion: ""restoreplan:- timestamp: "20220401174346"  tablefqns:  - public.t1  - public.t2singledatafile: falsetimestamp: "20220401174346"endtime: "20220401174348"withoutglobals: falsewithstatistics: falsestatus: Success

report文件内容展示:

[chris@gpt1 20220401174346]$ cat gpbackup_20220401174346_reportGreenplum Database Backup Report
timestamp key:         20220401174346gpdb version:          6.15.0 build commit:4e6288c9e9fca634b007a978fba3ce25aae26aedgpbackup version:      1.23.0+dev.6.gabcfe15
database name:         db3command line:          gpbackup --dbname=db3compression:           gzipplugin executable:     Nonebackup section:        All Sectionsobject filtering:      Noneincludes statistics:   Nodata file format:      Multiple Data Files Per Segmentincremental:           False
start time:            Fri Apr 01 2022 17:43:46end time:              Fri Apr 01 2022 17:43:48duration:              0:00:02
backup status:         Success
database size:         83 MB
count of database objects in backup:aggregates                   0casts                        0collations                   0constraints                  0conversions                  0default privileges           0database gucs                0event triggers               0extensions                   0foreign data wrappers        0foreign servers              0functions                    0indexes                      0operator classes             0operator families            0operators                    0procedural languages         0protocols                    0resource groups              3resource queues              2roles                        2rules                        0schemas                      3sequences                    0tables                       2tablespaces                  0text search configurations   0text search dictionaries     0text search parsers          0text search templates        0triggers                     0types                        0user mappings                0views                        0

toc.yaml文件内容展示(内容太长,节选部分):

[chris@gpt1 20220401174346]$ cat gpbackup_20220401174346_toc.yamlglobalentries:- schema: ""name: ""objecttype: SESSION GUCSreferenceobject: ""startbyte: 0endbyte: 31- schema: ""name: pg_defaultobjecttype: RESOURCE QUEUEreferenceobject: ""startbyte: 31endbyte: 93- schema: ""name: rs1objecttype: RESOURCE QUEUEreferenceobject: ""startbyte: 93endbyte: 172- schema: ""name: db3objecttype: DATABASE METADATAreferenceobject: ""startbyte: 1701endbyte: 1740predataentries:- schema: publicname: publicobjecttype: SCHEMAreferenceobject: ""startbyte: 1740endbyte: 1741- schema: publicname: t1objecttype: TABLEreferenceobject: ""startbyte: 2167endbyte: 2209postdataentries: []statisticsentries: []dataentries:- schema: publicname: t1oid: 16387attributestring: (id)rowscopied: 100partitionroot: ""incrementalmetadata:  ao: {}

metadata.sql文件内容展示(内容太长,节选部分):

SET client_encoding = 'UTF8';

ALTER RESOURCE QUEUE pg_default WITH (ACTIVE_STATEMENTS=20);
CREATE RESOURCE QUEUE rs1 WITH (ACTIVE_STATEMENTS=10, MAX_COST=400000000.00);
ALTER RESOURCE GROUP admin_group SET CPU_RATE_LIMIT 1;
ALTER RESOURCE GROUP admin_group SET MEMORY_LIMIT 1;
ALTER RESOURCE GROUP default_group SET CPU_RATE_LIMIT 1;
ALTER RESOURCE GROUP default_group SET MEMORY_LIMIT 1;
ALTER RESOURCE GROUP default_group SET MEMORY_LIMIT 0;
ALTER RESOURCE GROUP default_group SET MEMORY_SHARED_QUOTA 80;
ALTER RESOURCE GROUP default_group SET MEMORY_SPILL_RATIO 0;
ALTER RESOURCE GROUP default_group SET CONCURRENCY 20;
ALTER RESOURCE GROUP default_group SET CPU_RATE_LIMIT 30;
ALTER RESOURCE GROUP admin_group SET MEMORY_LIMIT 10;
ALTER RESOURCE GROUP admin_group SET MEMORY_SHARED_QUOTA 80;
ALTER RESOURCE GROUP admin_group SET MEMORY_SPILL_RATIO 0;
ALTER RESOURCE GROUP admin_group SET CONCURRENCY 10;
ALTER RESOURCE GROUP admin_group SET CPU_RATE_LIMIT 10;
CREATE RESOURCE GROUP rs2 WITH (CPU_RATE_LIMIT=1, MEMORY_AUDITOR=vmtracker, MEMORY_LIMIT=0, MEMORY_SHARED_QUOTA=80, MEMORY_SPILL_RATIO=0, CONCURRENCY=200);
CREATE ROLE chris;ALTER ROLE chris WITH SUPERUSER INHERIT CREATEROLE CREATEDB LOGIN REPLICATION PASSWORD 'md5757e3ad047f2a6e55fdd6ce7b66dcba5' RESOURCE QUEUE pg_default RESOURCE GROUP admin_group CREATEEXTTABLE (protocol='http') CREATEEXTTABLE (protocol='gpfdist', type='readable') CREATEEXTTABLE (protocol='gpfdist', type='writable');
CREATE ROLE dbuser3;ALTER ROLE dbuser3 WITH NOSUPERUSER INHERIT NOCREATEROLE NOCREATEDB LOGIN PASSWORD 'md5549ea76731c7b2f80ca2971c74ac2c3c' RESOURCE QUEUE rs1 RESOURCE GROUP rs2;......

生产表数据存储在segment实例的backups目录下,比如我这边:

/data/primary/gp1/backups/20220401/20220401182945,

默认情况下,每个表生成一个单独的gzip压缩文件,通过pg_class中的oid作为后缀来做表关联对应。segment节点不存储任何生产表数据之外的数据。

数据库中2个测试表的文件如下:

[chris@gpt2 20220401182945]$ ll总用量 8-rw-------. 1 chris chris  73 4月   1 18:29 gpbackup_1_20220401182945_16387.gz-rw-------. 1 chris chris 109 4月   1 18:29 gpbackup_1_20220401182945_16403.gz

解压打开其中一个表文件看一下,里面是csv内容:

1,1name12,12name15,15name20,20name23,23name

有关这些文件的更详细含义,请参考文章:

https://greenplum.docs.pivotal.io/backup-restore/1-24/admin_guide/managing/backup-gpbackup.html#topic_qwd_d5d_tbb

2.2 指定–backup-dir参数进行备份

实验语句:

[chris@gpt1 ~]$ gpbackup --dbname=db3 --backup-dir=/data/backups/日志省略~

实验总结:

指定–backup-dir的操作可以将备份统一到一个固定的目录,这就要求所有服务器上必须都存在–backup-dir后面指定的这个目录,比如我这里的目录是/data/backups/。这个适合公司对备份目录有固定要求,或者必须放置到共享存储中的场景,通过定义统一的目录,就可以把所有的备份数据都放在我们可以获知的任意位置(当然管理员用户必须具有目录的访问权限)。

Master节点上的信息展示如下,文件还是那些文件,只不过目录不同了。

[chris@gpt1 20220401184922]$ ll总用量 16-r--r--r--. 1 chris chris  737 4月   1 18:49 gpbackup_20220401184922_config.yaml-r--r--r--. 1 chris chris 2325 4月   1 18:49 gpbackup_20220401184922_metadata.sql-r--r--r--. 1 chris chris 1814 4月   1 18:49 gpbackup_20220401184922_report-r--r--r--. 1 chris chris 4075 4月   1 18:49 gpbackup_20220401184922_toc.yaml

Segment节点上的信息展示如下,可以看到是通过segment名字进行区别,所以不要担心在共享存储中会出现覆盖的问题。

[chris@gpt2 20220401184922]$ pwd/data/backups/gp0/backups/20220401/20220401184922[chris@gpt2 20220401184922]$ ll总用量 8-rw-------. 1 chris chris 115 4月   1 18:49 gpbackup_0_20220401184922_16403.gz-rw-------. 1 chris chris 138 4月   1 18:49 gpbackup_0_20220401184922_16409.gz

2.3 指定–data-only参数只备份数据

实验语句:

[chris@gpt1 20220401184922]$ gpbackup --dbname=db3 --backup-dir=/data/backups/ --data-only日志省略~

实验总结:

如果指定了–data-only,Master节点将不会导出创建数据库对象的DDL语句,这个场景只适合于数据临时导出操作,没有表结构,如果恢复的时候数据库中没有表,也无法实现恢复。个人感觉这种场景不太多,毕竟备份一下DDL也不浪费多少时间。

Master节点中查看metadata.sql文件,没有信息:

[chris@gpt1 20220401185833]$ pwd/data/backups/gp-1/backups/20220401/20220401185833[chris@gpt1 20220401185833]$ ll总用量 16-r--r--r--. 1 chris chris 736 4月   1 18:58 gpbackup_20220401185833_config.yaml-r--r--r--. 1 chris chris  31 4月   1 18:58 gpbackup_20220401185833_metadata.sql-r--r--r--. 1 chris chris 780 4月   1 18:58 gpbackup_20220401185833_report-r--r--r--. 1 chris chris 432 4月   1 18:58 gpbackup_20220401185833_toc.yaml[chris@gpt1 20220401185833]$ cat gpbackup_20220401185833_metadata.sql
SET client_encoding = 'UTF8';[chris@gpt1 20220401185833]$

Segment节点,显然只有表数据:

[chris@gpt2 20220401185833]$ pwd/data/backups/gp0/backups/20220401/20220401185833[chris@gpt2 20220401185833]$ ll总用量 8-rw-------. 1 chris chris 115 4月   1 18:58 gpbackup_0_20220401185833_16403.gz-rw-------. 1 chris chris 138 4月   1 18:58 gpbackup_0_20220401185833_16409.gz

2.4 指定–jobs参数进行并行备份

实验语句:

[chris@gpt1 ~]$ gpbackup --dbname=db3 --backup-dir=/data/backups/ --jobs=2我这里数据库中只创建了2个表,所以我直接用了2个并发,返回的日志与之前并没什么区别,忽略。

实验总结:

指定了–jobs=2参数以后,理论上在各个节点上备份时,会同时启动两个事务分别备份2个表,我们可以通过数据库的日志进行甄别,如下可以看到,四条日志中,前两条是上一次备份的日志,没开并行,可以看出时间是顺序的;后两条是本次开启2个并行的备份操作,可以看到基本是同一时间发起的:

2022-04-01 18:49:22.440657 CST,"chris","db3",p23834,th397211776,"10.211.55.65","57566",2022-04-01 18:49:22 CST,0,con119,cmd5,seg0,,dx48,,sx1,"LOG","00000","serializable isolation requested, falling back to repeatable read until serializable is supported in Greenplum",,,,,,"SET transaction_isolation TO 'serializable'",0,,"variable.c",604,2022-04-01 18:58:33.484600 CST,"chris","db3",p25688,th397211776,"10.211.55.65","57660",2022-04-01 18:58:33 CST,0,con122,cmd5,seg0,,dx49,,sx1,"LOG","00000","serializable isolation requested, falling back to repeatable read until serializable is supported in Greenplum",,,,,,"SET transaction_isolation TO 'serializable'",0,,"variable.c",604,2022-04-01 19:11:01.668405 CST,"chris","db3",p28223,th397211776,"10.211.55.65","57788",2022-04-01 19:11:01 CST,0,con127,cmd5,seg0,,dx50,,sx1,"LOG","00000","serializable isolation requested, falling back to repeatable read until serializable is supported in Greenplum",,,,,,"SET transaction_isolation TO 'serializable'",0,,"variable.c",604,2022-04-01 19:11:01.680513 CST,"chris","db3",p28227,th397211776,"10.211.55.65","57796",2022-04-01 19:11:01 CST,0,con128,cmd4,seg0,,dx51,,sx1,"LOG","00000","serializable isolation requested, falling back to repeatable read until serializable is supported in Greenplum",,,,,,"SET transaction_isolation TO 'serializable'",0,,"variable.c",604,

2.5 指定–single-data-file参数将segment数据备份成单个文件

实验语句:

[chris@gpt1 ~]$ gpbackup --dbname=db3 --backup-dir=/data/backups/ --jobs=2 --single-data-file20220401:20:40:04 gpbackup:chris:gpt1:006190-[CRITICAL]:-The following flags may not be specified together: jobs, metadata-only, single-data-file[chris@gpt1 ~]$ gpbackup --dbname=db3 --backup-dir=/data/backups/ --single-data-file

实验总结:

在上面的实验中,我首先把–jobs=2和–single-data-file参数同时使用,大家可以发现已经出现报错了,因为不支持这两个参数同时使用。下面第二个命令将并发参数去掉后,可以正常备份,这个参数会影响到segment节点把所有的表数据都备份到同一个文件中,如下查看单个segment备份目录下的文件可以看出:

[chris@gpt2 20220401204015]$ pwd/data/backups/gp1/backups/20220401/20220401204015[chris@gpt2 20220401204015]$ ll总用量 8-rw-rw-r--. 1 chris chris 247 4月   1 20:40 gpbackup_1_20220401204015.gz-r--r--r--. 1 chris chris 101 4月   1 20:40 gpbackup_1_20220401204015_toc.yaml

2.6 指定–incremental参数进行增量备份

增量备份只对AO表起作用,下面我们构造一下这个场景。

实验语句:

创建AO表,并插入四条数据:

[chris@gpt1 ~]$ psql -d db3 -U dbuser3 -h 127.0.0.1 -WPassword for user dbuser3:psql (9.4.24)Type "help" for help.
db3=> create table tao(id int) with (appendoptimized=true);NOTICE:  Table doesn't have 'DISTRIBUTED BY' clause -- Using column named 'id' as the Greenplum Database data distribution key for this table.HINT:  The 'DISTRIBUTED BY' clause determines the distribution of data. Make sure column(s) chosen are the optimal data distribution key to minimize skew.CREATE TABLEdb3=> insert into tao values(1),(2),(3),(4);INSERT 0 4db3=>

尝试带–incremental参数备份,可以预见到会报错两次,一次是因为没有同时指定–incremental和–leaf-partition-data参数;指定后,二次报错是没发现之前的全量备份版本,会报错推出:

[chris@gpt1 ~]$ gpbackup --dbname=db3 --backup-dir=/data/backups/ --incremental20220401:20:50:04 gpbackup:chris:gpt1:008159-[CRITICAL]:---leaf-partition-data must be specified with --incremental[chris@gpt1 ~]$ gpbackup --dbname=db3 --backup-dir=/data/backups/ --incremental --leaf-partition-data20220401:20:50:20 gpbackup:chris:gpt1:008213-[INFO]:-gpbackup version = 1.23.0+dev.6.gabcfe1520220401:20:50:20 gpbackup:chris:gpt1:008213-[INFO]:-Greenplum Database Version = 6.15.0 build commit:4e6288c9e9fca634b007a978fba3ce25aae26aed20220401:20:50:20 gpbackup:chris:gpt1:008213-[INFO]:-Starting backup of database db320220401:20:50:21 gpbackup:chris:gpt1:008213-[INFO]:-Backup Timestamp = 2022040120502020220401:20:50:21 gpbackup:chris:gpt1:008213-[INFO]:-Backup Database = db320220401:20:50:21 gpbackup:chris:gpt1:008213-[CRITICAL]:-There was no matching previous backup found with the flags provided. Please take a full backup.20220401:20:50:22 gpbackup:chris:gpt1:008213-[INFO]:-Found neither /usr/local/greenplum-db-6.15.0/bin/gp_email_contacts.yaml nor /home/chris/gp_email_contacts.yaml20220401:20:50:22 gpbackup:chris:gpt1:008213-[INFO]:-Email containing gpbackup report /data/backups/gp-1/backups/20220401/20220401205020/gpbackup_20220401205020_report will not be sent

重新备份,先执行全量备份,再执行增量备份,此处需要注意,增量备份所使用的基础备份,必须也带有–leaf-partition-data参数,否则仍然会报错:

[chris@gpt1 ~]$ gpbackup --dbname=db3 --backup-dir=/data/backups/ --leaf-partition-data日志省略~[chris@gpt1 ~]$ gpbackup --dbname=db3 --backup-dir=/data/backups/ --leaf-partition-data --incremental日志省略~

大家可以从下面的日志中看出,首先我先查看了一下所有的备份,其中最后两个文件夹,一个是base基础备份,另一个是增量备份文件夹,如果再次做增量备份,会生成一个基于上一次增量的新文件夹;然后我看了一下base基础备份里面,有3个文件,分别代表两个heap表t1/t2和ao表tao;接下来,我又进入了增量文件夹中,看到了只有两个文件,因为ao表没有做数据增加所以没有新的备份;我解压了其中的heap表,看到文件的数据是全量的。在下面的一个代码演示中,我会新增ao表的数据,咱们再看一看。

[chris@gpt2 20220401]$ ls20220401184922  20220401191101  20220401205020  20220401205440  20220401205603  20220401205649  20220401210014  2022040121041420220401185833  20220401204015  20220401205430  20220401205529  20220401205627  20220401205745  20220401210405[chris@gpt2 20220401210405]$ lsgpbackup_1_20220401210405_16403.gz  gpbackup_1_20220401210405_16409.gz  gpbackup_1_20220401210405_16415.gz[chris@gpt2 20220401210405]$ cd ..[chris@gpt2 20220401]$ cd 20220401210414[chris@gpt2 20220401210414]$ lsgpbackup_1_20220401210414_16403.gz  gpbackup_1_20220401210414_16409.gz[chris@gpt2 20220401210414]$ gunzip gpbackup_1_20220401210414_16403.gz[chris@gpt2 20220401210414]$ lsgpbackup_1_20220401210414_16403  gpbackup_1_20220401210414_16409.gz[chris@gpt2 20220401210414]$ cat gpbackup_1_20220401210414_164031121520233538404447部分省略

新增AO表数据(原来有4条数据,每个seg上应该有1条,再新增4条)看看是什么情况:

首先我们在segment host上查看一下之前备份的base基础数据,ao表中只有1条数据:

[chris@gpt2 20220401]$ cd 20220401210405[chris@gpt2 20220401210405]$ lsgpbackup_1_20220401210405_16403.gz  gpbackup_1_20220401210405_16409.gz  gpbackup_1_20220401210405_16415.gz[chris@gpt2 20220401210405]$ gunzip gpbackup_1_20220401210405_16415.gz[chris@gpt2 20220401210405]$ lsgpbackup_1_20220401210405_16403.gz  gpbackup_1_20220401210405_16409.gz  gpbackup_1_20220401210405_16415[chris@gpt2 20220401210405]$ cat gpbackup_1_20220401210405_164151

我们新增4条数据,再次备份,并查看增量备份的数据:

[chris@gpt1 ~]$ psql -d db3 -U dbuser3 -h 127.0.0.1 -WPassword for user dbuser3:psql (9.4.24)Type "help" for help.
db3=> insert into tao values(5),(6),(7),(8);INSERT 0 4db3=> \q[chris@gpt1 ~]$ gpbackup --dbname=db3 --backup-dir=/data/backups/ --leaf-partition-data --incremental下面切换回segment host查看[chris@gpt3 20220401]$ ls20220401184922  20220401191101  20220401205020  20220401205440  20220401205603  20220401205649  20220401210014  20220401210414  2022040121160820220401185833  20220401204015  20220401205430  20220401205529  20220401205627  20220401205745  20220401210405  20220401210816[chris@gpt3 20220401]$ cd 20220401211608[chris@gpt3 20220401211608]$ lsgpbackup_2_20220401211608_16403.gz  gpbackup_2_20220401211608_16409.gz  gpbackup_2_20220401211608_16415.gz[chris@gpt3 20220401211608]$ gunzip gpbackup_2_20220401211608_16415.gz[chris@gpt3 20220401211608]$ cat gpbackup_2_20220401211608_164155

实验总结:

增量备份参数–incremental,需要与–leaf-partition-data参数同时使用,并且在创建基础全量备份时,也必须带有该参数,否则增量备份找不到基础备份会报错退出。另外增量备份只对AO表有效,Heap表每次都会进行全量备份。

3 总 结

至此,本次 gpbackup 主题的中篇 – 备份参数详解就到此演示结束了,其中还有很多参数没有一一进行演示,大家可以自行安装操作进行尝鲜,文章中代码和日志演示较多,感谢大家耐心看到最后。

在将于下周推送的《下篇》中,我们会对 gprestore 进行演示并介绍一些其他的功能。欢迎大家关注!

作者简介

苑泽福,Greenplum中文社区专家

曾供职于鼎兴达、瀚高,拥有丰富的数据库开发运维经验,近年来一直专注于Greenplum 数据库,完成了多个基于Greenplum的数据平台的落地

分享本博文:

2020 Greenplum峰会

点击了解更多信息

《Data Warehousing with Greenplum》

Greenplum官方书籍《Data Warehousing with Greenplum》。阅读它,以了解如何充分利用Greenplum的功能。

关注微信公众号

Greenplum中文社区

Greenplum官方微信群

扫码加入我们的技术讨论,请备注“网站”