原 GreenPlum数据库的备份和恢复概述
Tags: 原创GreenPlum数据迁移备份恢复概述gpbackupgprestore
- 简介
- 备份和恢复概述
- 使用gpbackup和gprestore做并行备份
- 使用pg_dump做非并行备份
- 使用gpbackup和gprestore并行备份
- 需求和限制
- 备份或还原中包含的对象
- 执行基本备份和还原操作
- 从备份恢复
- 报告文件
- 历史文件
- 返回值
- 过滤备份或恢复的内容
- 根据叶子分区过滤
- 使用gprestore过滤
- 配置邮件通知
- gpbackup和gprestore邮件文件格式
- 电子邮件YAML文件部分
- 示例
- 理解备份文件
- 节点数据文件
- 使用gpbackup和gprestore创建增量备份
- 关于增量备份集
- 使用增量备份
- 使用增量备份集的例子
- 使用gpbackup创建增量备份
- 使用gprestore从增量备份恢复
- 增量备份说明
- 将gpbackup和gprestore与BoostFS一起使用
- 安装BoostFS
- 使用BoostFS备份和恢复
- 使用gpbackup存储插件
- 使用带有gpbackup和gprestore的S3存储插件
- S3存储插件配置文件格式
- 示例
- 备注
- 总结
- 参考
简介
定期执行备份能确保在数据损坏或者系统失效发生时能恢复数据或者重建Greenplum数据库系统。
用户还可以使用备份从一个Greenplum数据库系统迁移数据到另一个。
备份和恢复概述
Greenplum数据库支持并行和非并行的方法来备份和恢复数据库。 并行操作的规模不受系统中Segment数量的影响,因为每台Segment主机都同时把其数据写入到本地的磁盘存储上。 如果使用非并行备份和恢复操作,数据必须通过网络从Segment被发送到Master,后者把所有的数据写入它的存储中。 除了把I/O限制在一台主机上之外,非并行备份要求Master拥有足够的本地磁盘存储以保存整个数据库。
GreenPlum有几种备份工具,其中最常用的是gpbackup和gprestore,它们是GreenPlum官方提供的逻辑备份和恢复工具,它们可以并行地备份和恢复数据库的对象和数据,支持增量备份和压缩备份等功能,是一块逻辑备份恢复工具。另外,还有gpcrondump和gpdbrestore,它们是旧版本的并行备份恢复工具,但已经不再维护。还有pg_dump、pg_dumpall和pg_restore,它们是非并行的备份恢复工具,需要通过master节点来执行。
使用gpbackup和gprestore做并行备份
gpbackup和gprestore是Greenplum数据库的备份和恢复工具。 gpbackup在每个独立的表级别使用ACCESS SHARE锁,而不是在pg_class catalog表里加EXCLUSIVE锁。 这使得你可以在backup期间执行任意查询和DML语句,但是如CREATE,ALTER,DROP和TRUNCATE操作,只要这些操作没有执行在备份的数据上就可以。
使用gpbackup创建的备份文件旨在提供将来恢复单个数据库对象及其依赖项的功能,例如函数和所需的用户定义数据类型。 参考使用gpbackup和gprestore并行备份获取更多信息。
使用pg_dump做非并行备份
PostgreSQL pg_dump和pg_dumpall非并行备份工具可以用来在master主机上创建一个单独的,包含所有节点数据的dump文件。
PostgreSQL的非并行工具应该在特殊场合使用。 它们比使用Greenplum backup工具要慢得多,因为所有数据都必须通过master。 此外,通常情况是master主机没有足够的磁盘空间来保存整个分布式Greenplum数据库的备份。
pg_restore工具需要pg_dump或pg_dumpall创建的压缩dump文件。 在开始还原之前,应修改dump文件中的CREATE TABLE语句以包含Greenplum DISTRIBUTED子句。 如果您不包含DISTRIBUTED子句,Greenplum数据库会分配默认值,这可能不是最佳值。 有关详细信息,请参阅Greenplum数据库参考指南中的CREATE TABLE。
使用并行的备份文件来做一个非并行的恢复,可以从每个segment节点拷贝备份文件到master节点,然后通过master加装它们。
Figure 1. 使用并行的备份文件来做一个非并行的恢复
备份Greenplum数据库数据的另一种非并行方法是使用COPY TO SQL命令将数据库中的全部或部分表复制到master主机上的分隔文本文件。
使用gpbackup和gprestore并行备份
gpbackup和gprestore是Greenplum数据库工具,可为Greenplum数据库创建和恢复备份集。 默认情况下,gpbackup仅在Greenplum数据库master数据目录中存储备份的对象元数据文件和DDL文件。 Greenplum数据库节点使用COPY … ON SEGMENT命令将备份表的数据存储在位于每个节点的backups目录中的压缩CSV数据文件中。
元数据备份文件包含gprestore并行恢复完整备份集所需的所有信息。 备份元数据还提供了在gprestore的未来版本中仅用于还原数据集中的单个对象以及任何依赖对象的框架。 (参考理解备份文件获取更新信息。) 将表数据存储在CSV文件中还提供了使用其他恢复工具(如gpload)在同一群集或其他群集中加载数据的机会。 默认情况下,为节点上的每个表创建一个文件。 您可以使用gpbackup指定--leaf-partition-data选项,以便为分区表的每个叶子分区创建一个数据文件,而不是单个文件。 此选项还允许您按叶分区筛选备份集。
每个gpbackup任务都使用Greenplum数据库中的单个事务。 在此事务期间,元数据将在master主机上备份,并且每个节点主机上的每个表的数据将使用COPY … ON SEGMENT命令并行写入CSV备份文件。 备份进程在备份的每个表上获取ACCESS SHARE锁。
关于gpbackup和gprestore工具的更多选项, 参考gpbackup和 gprestore。
- 需求和限制
- 备份或还原中包含的对象
- 执行基本备份和还原操作
- 过滤备份或恢复的内容
- 配置邮件通知
- 理解备份文件
- 使用gpbackup和gprestore创建增量备份
- 将gpbackup和gprestore与BoostFS一起使用
- 使用gpbackup存储插件
- 备份/恢复存储插件API(Beta版)
Parent topic: 备份和恢复数据库
需求和限制
gpbackup和gprestore工具在Greenplum数据库5.5.0和之后的版本可用。
gpbackup和gprestore有如下限制:
如果在父分区表上创建索引,则gpbackup不会在父分区的子分区表上备份相同的索引,因为在子分区上创建相同的索引会导致错误。 但是,如果您交换分区,则gpbackup不会检测到交换分区上的索引是从新父表继承的。 在这种情况下,gpbackup备份冲突的CREATE INDEX语句,这会在还原备份集时导致错误。
您可以执行gpbackup的多个实例,但每次执行都需要不同的时间戳。
数据库对象过滤目前仅限于schema和表。
如果使用gpbackup —single-data-file选项将表备份组合到每个节点的单个文件中, 则无法使用gprestore执行并行还原操作(无法将--jobs设置为大于1的值)。
您不能将--exclude-table-file与--leaf-partition-data一起使用。 虽然您可以在使用--exclude-table-file指定的文件中指定叶子分区名称,但gpbackup会忽略分区名称。
在运行DDL命令的同时使用gpbackup备份数据库可能会导致gpbackup失败,以确保备份集内的一致性。 例如,如果在备份操作开始后删除了表,则gpbackup将退出并显示错误消息ERROR: relation does not exist。
由于表锁定问题,在备份操作期间删除表时,gpbackup可能会失败。 gpbackup生成要备份的表列表,并在表上获取ACCESS SHARED锁。 如果表上保留了EXCLUSIVE LOCK,则gpbackup会在释放现有锁后获取ACCESS SHARED锁。 如果gpbackup尝试获取表上的锁时表不再存在,则gpbackup将退出并显示错误消息。
对于可能在备份期间删除的表,可以使用gpbackup表过滤选项(例如--exclude-table或--exclude-schema)从备份中排除表。
使用gpexpand创建的备份只能还原到与源集群具有相同数量的节点实例的Greenplum数据库集群。 如果运行gpexpand将节点添加到集群,则在扩容完成后无法恢复在扩容之前所做的备份。
备份或还原中包含的对象
下表列出了使用gpbackup和gprestore备份和还原的对象。 使用--dbname选项为您指定备份的数据库对象。 默认情况下也会备份全局对象(Greenplum数据库系统对象),但只有在gprestore中包含--with-globals选项时才会还原它们。
数据库(使用—dbname指定的数据库) | 全局(需要指定—with-globals选项来还原) |
---|---|
会话级别的配置参数设置(GUCs)Schemas,参考Note过程语言扩展序列注释表Indexes所有者可写外部表(DDL only)可读外部表(DDL only)函数聚合类型转换类型视图协议触发器。(虽然Greenplum数据库不支持触发器,但会备份和恢复任何存在的触发器定义。)规则域运算符,运算符族和运算符类转换扩展文本搜索解析器,词典,模板和配置 | 表空间数据库数据库范围的配置参数设置(GUCs)Resource group定义Resource queue定义角色GRANT分配给数据库的角色 |
Note: 这些schemas不包含在备份中。
- gp_toolkit
- information_schema
- pg_aoseg
- pg_bitmapindex
- pg_catalog
- pg_toast*
- pg_temp*
还原到已存在数据库时,gprestore假定在将对象还原到public schema时存在public schema。 还原到新数据库(使用--create-db选项)时,gprestore会在使用CREATE DATABASE命令创建数据库时自动创建public schema。 该命令使用包含public schema的template0数据库。
执行基本备份和还原操作
要执行数据库的完整备份以及Greenplum数据库系统元数据,请使用以下命令:
1 | $ gpbackup --dbname <database_name> |
例如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | $ 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 |
上面的命令在Greenplum数据库master主机的默认目录中创建一个包含全局和数据库特定元数据的文件, $MASTER_DATA_DIRECTORY/backups///。 例如:
1 2 3 | $ ls /gpmaster/gpsne-1/backups/20180105/20180105112754 gpbackup_20180105112754_config.yaml gpbackup_20180105112754_report gpbackup_20180105112754_metadata.sql gpbackup_20180105112754_toc.yaml |
默认情况下,每个节点用一个独立的压缩CSV文件在/backups///存储备份的每个表的数据:
1 2 3 | $ ls /gpdata1/gpsne0/backups/20180105/20180105112754/ gpbackup_0_20180105112754_17166.gz gpbackup_0_20180105112754_26303.gz gpbackup_0_20180105112754_21816.gz |
要将所有备份文件合并到一个目录中,请包含--backup-dir选项。 请注意,您必须使用此选项指定绝对路径:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | $ 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。
从备份恢复
使用gprestore从备份集合恢复,必须使用--timestamp选项指定准确的时间戳值(YYYYMMDDHHMMSS)。 包括--create-db选项,如果数据库未在集群中创建。 例如:
1 2 3 4 5 6 7 8 9 10 11 | $ 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 |
如果指定自定义的--backup-dir来合并备份文件,使用gprestore时指定相同的--backup-dir选项来定位备份文件:
1 2 3 4 5 | $ 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使用一个连接去恢复表数据和元数据。 如果备份集非常大,可以使用--jobs选项来提高并发连接数从而提升恢复性能。 例如:
1 | $ gprestore --backup-dir /home/gpadmin/backups/ --timestamp 20171103153156 --create-db --jobs 8 |
测试备份集的并行连接数,以确定快速数据恢复的理想数量。
Note: 如果备份使用gpbackup的--single-data-file选项将表备份组合到每个节点的单个文件中,则无法使用gprestore执行并行还原操作。
报告文件
当执行备份和恢复操作时,gpbackup和gprestore会生成一个报告文件。 当配置了邮件通知,发送的邮件内容会包含报告文件。 关于邮件通知的信息,参考配置邮件通知。
报告文件在Greenplum数据库master的备份目录中。 报告文件名包含操作的时间戳。 这些是gpbackup和gprestore报告文件名的格式。
1 2 | gpbackup_<backup_timestamp>_report gprestore_<backup_timestamp>_<restore_timesamp>_report |
对于这些报告文件名的样例,20180213114446是备份的时间戳,20180213115426是恢复操作的时间戳。
1 2 | gpbackup_20180213114446_report gprestore_20180213114446_20180213115426_report |
这个在Greenplum数据库master主机上的备份目录包含了gpbackup和gprestore的报告文件。
1 2 3 4 5 6 7 | $ 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报告文件内容的示例。