gpbackup 和 gprestore是Greenplum数据库工具,用于创建和恢复Greenplum数据库的备份集。默认情况下,gpbackup仅将对象元数据文件和DDL文件,存储在Greenplum数据库Master的数据目录中以进行备份。Greenplum数据库Segment使用 COPY ... ON SEGMENT命令,将所备份表的数据存储在压缩的CSV数据文件中,这些压缩文件位于每个Segment的backups目录下。
备份的元数据文件包含了gprestore 并行恢复完整备份集所需的全部信息。备份的元数据还提供了一个框架,用于在将来的gprestore版本中,仅还原数据集的单个对象以及任何依赖对象。(有关更多信息,请参阅理解备份文件。)将表数据存储在CSV文件,还提供了使用其他恢复工具(例如gpload)的机会,来将数据加载到同一群集或另一个群集中。默认情况下,Segment上的每个表会创建一个文件。您可使用带--leaf-partition-data选项的gpbackup,为分区表的每个子叶分区创建一个数据文件,而不是一个单独的文件。此选项还允许您可以按子叶分区过滤备份集。
每个gpbackup任务在Greenplum数据库中使用单个事务。在此事务期间,元数据被备份到Master主机上,每个Segment主机上每个表的数据通过使用COPY ... ON SEGMENT命令,被并行写入CSV备份文件中。备份进程在备份的每个表上获取一个ACCESS SHARE锁。
gpbackup 和 gprestore 工具兼容以下的Greenplum数据库版本:
由于表锁定问题,在备份操作期间删除表时,gpbackup可能会失败。 gpbackup 生成要备份的表列表,并在表上获取ACCESS SHARED锁。如果表上持有独占锁,gpbackup将在现有锁释放后获取 ACCESS SHARED锁。如果gpbackup尝试获取表的锁时该表不再存在,gpbackup将退出并显示错误消息。
对于备份过程中可能删除的表,可以使用gpbackup的表过滤选项(例如--exclude table或--exclude schema),从备份中排除这些表。
下表列出了 gpbackup 和 gprestore备份和恢复的对象。
您使用-dbname 选项指定的数据库,会备份其中的数据库对象。
数据库对象 | 全局对象 |
---|---|
|
|
注意:以下schema不包含在备份中。
- gp_toolkit
- information_schema
- pg_aoseg
- pg_bitmapindex
- pg_catalog
- pg_toast*
- pg_temp*
当恢复到现有的数据库时, gprestore 在将对象恢复到public schema时,会假定public schema已存在。当恢复到新的数据库时(使用 --create-db 选项), 若以CREATE DATABASE创建数据库,则gprestore 会自动创建public schema。该命令使用包含了public schema的template0数据库。
另请参阅理解备份文件。
$ gpbackup --dbname <database_name>
$ gpbackup --dbname demo
20180105:11:27:54 gpbackup:gpadmin:centos6.localdomain:002182-[INFO]:-Starting backup of database demo
20180105:11:27:54 gpbackup:gpadmin:centos6.localdomain:002182-[INFO]:-Backup Timestamp = 20180105112754
20180105:11:27:54 gpbackup:gpadmin:centos6.localdomain:002182-[INFO]:-Backup Database = demo
20180105:11:27:54 gpbackup:gpadmin:centos6.localdomain:002182-[INFO]:-Backup Type = Unfiltered Compressed Full Backup
20180105:11:27:54 gpbackup:gpadmin:centos6.localdomain:002182-[INFO]:-Gathering list of tables for backup
20180105:11:27:54 gpbackup:gpadmin:centos6.localdomain:002182-[INFO]:-Acquiring ACCESS SHARE locks on tables
Locks acquired: 6 / 6 [================================================================] 100.00% 0s
20180105:11:27:54 gpbackup:gpadmin:centos6.localdomain:002182-[INFO]:-Gathering additional table metadata
20180105:11:27:54 gpbackup:gpadmin:centos6.localdomain:002182-[INFO]:-Writing global database metadata
20180105:11:27:54 gpbackup:gpadmin:centos6.localdomain:002182-[INFO]:-Global database metadata backup complete
20180105:11:27:54 gpbackup:gpadmin:centos6.localdomain:002182-[INFO]:-Writing pre-data metadata
20180105:11:27:54 gpbackup:gpadmin:centos6.localdomain:002182-[INFO]:-Pre-data metadata backup complete
20180105:11:27:54 gpbackup:gpadmin:centos6.localdomain:002182-[INFO]:-Writing post-data metadata
20180105:11:27:54 gpbackup:gpadmin:centos6.localdomain:002182-[INFO]:-Post-data metadata backup complete
20180105:11:27:54 gpbackup:gpadmin:centos6.localdomain:002182-[INFO]:-Writing data to file
Tables backed up: 3 / 3 [==============================================================] 100.00% 0s
20180105:11:27:54 gpbackup:gpadmin:centos6.localdomain:002182-[INFO]:-Data backup complete
20180105:11:27:54 gpbackup:gpadmin:centos6.localdomain:002182-[INFO]:-Found neither /usr/local/greenplum-db/./bin/gp_email_contacts.yaml nor /home/gpadmin/gp_email_contacts.yaml
20180105:11:27:54 gpbackup:gpadmin:centos6.localdomain:002182-[INFO]:-Email containing gpbackup report /gpmaster/seg-1/backups/20180105/20180105112754/gpbackup_20180105112754_report will not be sent
20180105:11:27:55 gpbackup:gpadmin:centos6.localdomain:002182-[INFO]:-Backup completed successfully
$ ls /gpmaster/gpsne-1/backups/20180105/20180105112754
gpbackup_20180105112754_config.yaml gpbackup_20180105112754_report
gpbackup_20180105112754_metadata.sql gpbackup_20180105112754_toc.yaml
$ ls /gpdata1/gpsne0/backups/20180105/20180105112754/
gpbackup_0_20180105112754_17166.gz gpbackup_0_20180105112754_26303.gz
gpbackup_0_20180105112754_21816.gz
$ gpbackup --dbname demo --backup-dir /home/gpadmin/backups
20171103:15:31:56 gpbackup:gpadmin:0ee2f5fb02c9:017586-[INFO]:-Starting backup of database demo
...
20171103:15:31:58 gpbackup:gpadmin:0ee2f5fb02c9:017586-[INFO]:-Backup completed successfully
$ find /home/gpadmin/backups/ -type f
/home/gpadmin/backups/gpseg0/backups/20171103/20171103153156/gpbackup_0_20171103153156_16543.gz
/home/gpadmin/backups/gpseg0/backups/20171103/20171103153156/gpbackup_0_20171103153156_16524.gz
/home/gpadmin/backups/gpseg1/backups/20171103/20171103153156/gpbackup_1_20171103153156_16543.gz
/home/gpadmin/backups/gpseg1/backups/20171103/20171103153156/gpbackup_1_20171103153156_16524.gz
/home/gpadmin/backups/gpseg-1/backups/20171103/20171103153156/gpbackup_20171103153156_config.yaml
/home/gpadmin/backups/gpseg-1/backups/20171103/20171103153156/gpbackup_20171103153156_predata.sql
/home/gpadmin/backups/gpseg-1/backups/20171103/20171103153156/gpbackup_20171103153156_global.sql
/home/gpadmin/backups/gpseg-1/backups/20171103/20171103153156/gpbackup_20171103153156_postdata.sql
/home/gpadmin/backups/gpseg-1/backups/20171103/20171103153156/gpbackup_20171103153156_report
/home/gpadmin/backups/gpseg-1/backups/20171103/20171103153156/gpbackup_20171103153156_toc.yaml
执行备份操作时,可以在多个文件的额外开销可能过高的情况下使用--single-data-file。例如,如果您使用第三方存储解决方案(例如带备份的Data Domain)。
注意:备份实例化视图不会备份实例化视图数据。仅备份实例化视图定义。
$ dropdb demo
$ gprestore --timestamp 20171103152558 --create-db
20171103:15:45:30 gprestore:gpadmin:0ee2f5fb02c9:017714-[INFO]:-Restore Key = 20171103152558
20171103:15:45:31 gprestore:gpadmin:0ee2f5fb02c9:017714-[INFO]:-Creating database
20171103:15:45:44 gprestore:gpadmin:0ee2f5fb02c9:017714-[INFO]:-Database creation complete
20171103:15:45:44 gprestore:gpadmin:0ee2f5fb02c9:017714-[INFO]:-Restoring pre-data metadata from /gpmaster/gpsne-1/backups/20171103/20171103152558/gpbackup_20171103152558_predata.sql
20171103:15:45:45 gprestore:gpadmin:0ee2f5fb02c9:017714-[INFO]:-Pre-data metadata restore complete
20171103:15:45:45 gprestore:gpadmin:0ee2f5fb02c9:017714-[INFO]:-Restoring data
20171103:15:45:45 gprestore:gpadmin:0ee2f5fb02c9:017714-[INFO]:-Data restore complete
20171103:15:45:45 gprestore:gpadmin:0ee2f5fb02c9:017714-[INFO]:-Restoring post-data metadata from /gpmaster/gpsne-1/backups/20171103/20171103152558/gpbackup_20171103152558_postdata.sql
20171103:15:45:45 gprestore:gpadmin:0ee2f5fb02c9:017714-[INFO]:-Post-data metadata restore complete
$ dropdb demo
$ gprestore --backup-dir /home/gpadmin/backups/ --timestamp 20171103153156 --create-db
20171103:15:51:02 gprestore:gpadmin:0ee2f5fb02c9:017819-[INFO]:-Restore Key = 20171103153156
...
20171103:15:51:17 gprestore:gpadmin:0ee2f5fb02c9:017819-[INFO]:-Post-data metadata restore complete
gprestore默认情况下不会尝试为Greenplum系统恢复全局元数据。如果需要,请包含--with-globals 参数。
$ gprestore --backup-dir /home/gpadmin/backups/ --timestamp 20171103153156 --create-db --jobs 8
测试备份集的并行连接数,以确定快速数据恢复的理想数量。
注意:如果备份使用gpbackup选项 --single-data-file,将表备份合并到每个Segment的单个文件中,则无法使用gprestore执行并行恢复操作。
恢复物化视图不会恢复物化视图的数据。仅恢复实例化视图定义。要用数据填充物化视图,请使用REFRESH MATERIALIZED VIEW。刷新物化视图时,物化视图定义中引用的表必须可用。gprestore 日志文件列出了已恢复的物化视图,以及 EFRESH MATERIALIZED VIEW命令,可使用该命令来填充数据到物化视图。
执行备份或恢复操作时, gpbackup 和 gprestore生成一个报告文件。配置电子邮件通知后,发送的电子邮件包含报告文件的内容。有关电子邮件通知的信息,请参阅“ 配置电子邮件通知”。
该报告文件位于Greenplum数据库Master的备份目录中。报告文件名包含操作的时间戳。以下是gpbackup 和 gprestore 报告文件名的格式。
gpbackup_<backup_timestamp>_report
gprestore_<backup_timestamp>_<restore_timesamp>_report
对于这些报告文件名的示例, 20180213114446 是备份的时间戳, 20180213115426 是恢复操作的时间戳。
gpbackup_20180213114446_report
gprestore_20180213114446_20180213115426_report
Greenplum数据库Master主机上的备份目录包含了 gpbackup 和 gprestore 的报告文件。
$ ls -l /gpmaster/seg-1/backups/20180213/20180213114446
total 36
-r--r--r--. 1 gpadmin gpadmin 295 Feb 13 11:44 gpbackup_20180213114446_config.yaml
-r--r--r--. 1 gpadmin gpadmin 1855 Feb 13 11:44 gpbackup_20180213114446_metadata.sql
-r--r--r--. 1 gpadmin gpadmin 1402 Feb 13 11:44 gpbackup_20180213114446_report
-r--r--r--. 1 gpadmin gpadmin 2199 Feb 13 11:44 gpbackup_20180213114446_toc.yaml
-r--r--r--. 1 gpadmin gpadmin 404 Feb 13 11:54 gprestore_20180213114446_20180213115426_report
报告文件的内容相似。这是 gprestore 报告文件内容的一个示例。
Greenplum Database Restore Report
Timestamp Key: 20180213114446
GPDB Version: 5.4.1+dev.8.g9f83645 build commit:9f836456b00f855959d52749d5790ed1c6efc042
gprestore Version: 1.0.0-alpha.3+dev.73.g0406681
Database Name: test
Command Line: gprestore --timestamp 20180213114446 --with-globals --createdb
Start Time: 2018-02-13 11:54:26
End Time: 2018-02-13 11:54:31
Duration: 0:00:05
Restore Status: Success
执行备份操作时, gpbackup 将备份信息附加到gpbackup历史记录文件(gpbackup_history.yaml)中,该文件位于Greenplum数据库Master的数据目录中。该文件包含备份时间戳、有关备份选项的信息以及增量备份的备份集信息。gpbackup不备份该文件。
使用--incremental选项运行gpbackup时,gpbackup使用文件中的信息为增量备份查找匹配的备份,请勿指定--from timesamp选项,以便指示要用作最新版的备份,就在增量备份集中。有关增量备份的信息,请参阅使用gpbackup和gprestore创建和使用增量备份。
gpbackup 备份指定数据库中的所有schema和表,除非您使用schema级或表级的过滤器选项,排除或包括了单个的schema或表对象。
$ gpbackup --dbname demo --include-schema wikipedia
$ gpbackup --dbname demo --exclude-schema twitter
$ gpbackup --dbname demo --include-schema wikipedia --include-schema twitter
gpbackup --dbname demo --include-schema-file /users/home/gpadmin/backup-schemas
要过滤备份集中包含或排除的单个表,请使用 --include-table 选项或 --exclude-table选项。该表必须是限定schema的: <schema-name>.<table-name>。可以分多次指定各个表的过滤选项。然而,--include-table 和 --exclude-table 不能同时用于同一命令。
wikipedia.articles
twitter.message
beer."IPA"
"Wine".riesling
"Wine"."sauvignon blanc"
water.tonic
$ gpbackup --dbname demo --include-table-file /home/gpadmin/table-list.txt
您可以将-include schema与--exclude-table或--exclude-table-file结合使用以进行备份。以下示例使用--include-schema和--exclude-table来备份除单个表之外的schema。
$ gpbackup --dbname demo --include-schema mydata --exclude-table mydata.addresses
您不能将-include schema与 --include-table 或--include-table-file结合使用,也不能将--exclude schema与任何表过滤选项(如--exclude table或--include table)结合使用。
使用--include-table或--include-table-file时,依赖对象不会自动地备份或恢复,您必须显式指定所需的依赖对象。例如,如果您备份或恢复一个视图或物化视图,则还必须指定该视图或物化视图使用的表。如果备份或恢复使用了序列的表,则还必须指定序列。
demo=# CREATE TABLE sales (id int, date date, amt decimal(10,2))
DISTRIBUTED BY (id)
PARTITION BY RANGE (date)
( PARTITION Jan17 START (date '2017-01-01') INCLUSIVE ,
PARTITION Feb17 START (date '2017-02-01') INCLUSIVE ,
PARTITION Mar17 START (date '2017-03-01') INCLUSIVE ,
PARTITION Apr17 START (date '2017-04-01') INCLUSIVE ,
PARTITION May17 START (date '2017-05-01') INCLUSIVE ,
PARTITION Jun17 START (date '2017-06-01') INCLUSIVE ,
PARTITION Jul17 START (date '2017-07-01') INCLUSIVE ,
PARTITION Aug17 START (date '2017-08-01') INCLUSIVE ,
PARTITION Sep17 START (date '2017-09-01') INCLUSIVE ,
PARTITION Oct17 START (date '2017-10-01') INCLUSIVE ,
PARTITION Nov17 START (date '2017-11-01') INCLUSIVE ,
PARTITION Dec17 START (date '2017-12-01') INCLUSIVE
END (date '2018-01-01') EXCLUSIVE );
NOTICE: CREATE TABLE will create partition "sales_1_prt_jan17" for table "sales"
NOTICE: CREATE TABLE will create partition "sales_1_prt_feb17" for table "sales"
NOTICE: CREATE TABLE will create partition "sales_1_prt_mar17" for table "sales"
NOTICE: CREATE TABLE will create partition "sales_1_prt_apr17" for table "sales"
NOTICE: CREATE TABLE will create partition "sales_1_prt_may17" for table "sales"
NOTICE: CREATE TABLE will create partition "sales_1_prt_jun17" for table "sales"
NOTICE: CREATE TABLE will create partition "sales_1_prt_jul17" for table "sales"
NOTICE: CREATE TABLE will create partition "sales_1_prt_aug17" for table "sales"
NOTICE: CREATE TABLE will create partition "sales_1_prt_sep17" for table "sales"
NOTICE: CREATE TABLE will create partition "sales_1_prt_oct17" for table "sales"
NOTICE: CREATE TABLE will create partition "sales_1_prt_nov17" for table "sales"
NOTICE: CREATE TABLE will create partition "sales_1_prt_dec17" for table "sales"
CREATE TABLE
public.sales_1_prt_oct17
public.sales_1_prt_nov17
public.sales_1_prt_dec17
$ gpbackup --dbname demo --include-table-file last-quarter.txt --leaf-partition-data
$ gpbackup --dbname demo --include-table public.sales --leaf-partition-data
备份叶子分区时,叶子分区的数据与整个分区表的元数据一起备份。
注意:您不能将--exclude-table-file 与--leaf-partition-data 选项一起使用。虽然您可以在--exclude-table-file文件中指定叶子分区名称,但 gpbackup 会忽略这些分区名称。
当恢复一个包含了分区表的某些叶子分区数据的备份集时,将恢复分区表以及叶子分区的数据。例如,使用gpbackup 选项--include-table-file创建一个备份,在文本文件中列出了分区表的一些叶子分区。恢复该备份时会创建分区表,并且仅还原文件中列出的叶子分区的数据。
gpbackup 和 gprestore 可以在备份或恢复操作完成后发送电子邮件通知。
要让 gpbackup 或 gprestore 发送状态电子邮件通知,您必须将一个名为 gp_email_contacts.yaml 的文件,放在运行gpbackup 或 gprestore 的用户home目录下,或放在工具的同一目录($GPHOME/bin)下。如果工具在这两个位置均无法找到gp_email_contacts.yaml文件,则它会发出一条消息。如果两个位置都包含.yaml 文件,则工具会使用用户$HOME目录下的那一个文件。
电子邮件主题行包括工具名称、时间戳、状态和Greenplum数据库Master的名称。以下是gpbackup 电子邮件的一个主题行示例。
gpbackup 20180202133601 on gp-master completed
该电子邮件包含有关操作的摘要信息,包括选项、持续时间以及备份或恢复的对象数。有关通知电子邮件内容的信息,请参阅报告文件。
注意: UNIX邮件程序必须在Greenplum数据库主机上运行,并且必须配置为允许Greenplum超级用户(gpadmin)发送电子邮件。还要确保可通过gpadmin 用户的$PATH,能找到邮件程序的可执行文件。
gpbackup 和 gprestore电子邮件通知为YAML文件gp_email_contacts.yaml,它使用缩进(空格)来确定文档层次结构各节之间的关系。空格的使用非常重要。不应将空格简单地用于格式化,也不应使用制表符。
注意:如果 未正确指定status 参数,则程序不会发出警告。例如,如果success参数拼写错误并设置为true,则在成功操作后不会发出警告,也不会向电子邮件地址发送电子邮件。要确保正确配置了电子邮件通知,请在配置了电子邮件通知的情况下运行测试。
以下是 gpbackup 电子邮件通知的YAML文件gp_email_contacts.yaml :
contacts:
gpbackup:
- address: user@domain
status:
success: [true | false]
success_with_errors: [true | false]
failure: [true | false]
gprestore:
- address: user@domain
status:
success: [true | false]
success_with_errors: [true | false]
failure: [true | false]
contacts :必须。此节包含gpbackup 和 gprestore两个子节。YAML文件可以包含一个 gpbackup 子节、一个 gprestore 子节、或各一个。
gpbackup:可选。开始定义gpbackup 电子邮件的节。
address:必须。必须至少指定一个电子邮件地址。可以指定多个电子邮件地址参数。每个地址都需要一个 status 子节。user@domain是一个有效的电子邮件地址。
status:必须。指定工具何时向指定的电子邮件地址发送电子邮件。默认为不发送电子邮件通知。
您可以根据备份或恢复操作的完成状态来指定发送电子邮件通知。必须至少指定以下参数之一,并且每个参数最多出现一次。
success:可选。指定在操作完成且没有错误的情况下,是否发送电子邮件。如果值为true,则在操作完成且没有错误的情况下,会发送一封电子邮件。如果值为 false(默认),则不发送电子邮件。
success_with_errors:可选。指定操作完成但有错误的情况下,是否发送电子邮件。如果值为true,则在操作完成且有错误的情况下,会发送一封电子邮件。如果值为false(默认),不发送电子邮件。
failure:可选。指定在操作失败的情况下,是否发送电子邮件。如果值为true,则在操作失败的情况下,会发送一封电子邮件。如果值为false(默认),不发送电子邮件。
gprestore
可选。开始定义gprestore电子邮件的节。本节包含address 和 status 参数,用来在gprestore操作后发送电子邮件通知 。语法与gpbackup 的节相同。
contacts:
gpbackup:
- address: gpadmin@example.com
status:
success:true
- address: my_dba@example.com
status:
success_with_errors: true
failure: true
gprestore:
- address: gpadmin@example.com
status:
success: true
success_with_errors: true
警告:所有gpbackup元数据文件是使用只读权限创建的。请勿删除或修改gpbackup 备份集的元数据文件。这样做会使备份文件无法正常工作。
gpbackup 的完整备份集 包括多个元数据文件、支持文件和CSV数据文件,每个文件都标明了创建备份时的时间戳。
文档名称 | 描述 |
---|---|
gpbackup_ <YYYYMMDDHHMMSS> _metadata.sql | 包含全局和特定于数据库的元数据:
在恢复实际数据之前 必须创建的、特定于数据库的对象包括:
|
gpbackup_ <YYYYMMDDHHMMSS> _toc.yaml | 包含用于在_predata.sql和_postdata.sql文件中定位对象DDL的元数据 。该文件还包含表名和OID,它们用于在每个Segment上创建的CSV数据文件中,定位对应的表数据。请参见 Segment数据文件。 |
gpbackup_ <YYYYMMDDHHMMSS> _report | 包含有关备份操作的信息,该信息用于生成备份完成后发送的电子邮件通知(如果已配置)。该文件包含以下信息:
|
gpbackup_ <YYYYMMDDHHMMSS> _config.yaml | 包含有关特定备份任务执行的元数据,包括:
|
gpbackup_ <YYYYMMDDHHMMSS> _statistics.sql | 包含表统计信息。 当gpbackup时指定选项 --with-stats,会创建此文件。当gprestore 时指定选项 --with-stats, 统计信息会被恢复。 |
gpbackup_history.yaml | 包含有关使用gpbackup命令创建备份时所使用的选项的信息 ,以及有关增量备份的信息。 存储在Greenplum数据库Master主机上的Master数据目录下。 该文件不是通过gpbackup备份的。 有关增量备份的信息,请参阅使用gpbackup和gprestore创建和使用增量备份。 |
默认情况下,每个Segment都会为所备份的每个表,在Segment上创建一个压缩的CSV文件。您可以选择指定--single-data-file选项,以在每个Segment上创建一个单数据文件。这些文件存储在<seg_dir>/backups/YYYYMMDD/YYYYMMDDHHMMSS/。
如果指定自定义的备份目录,则该路径作为备份目录下的子目录,Segment数据文件被复制到此处。如果包括--leaf-partition-data选项, gpbackup 为分区表的每个叶子分区创建一个数据文件,而不是创建成一个单文件。
您可以选择使用--compression-level选项,指定gzip命令的压缩级别(从1到9),或使用--no-compression选项,完全禁用压缩。如果您未指定压缩级别, gpbackup 默认使用压缩级别1。