GreenPlum备份与恢复
一、简介
Greenplum数据库支持并行和非并行方法来备份和还原数据库。并行操作可扩展,而与系统中段的数量无关,因为段主机各自将数据同时写入本地磁盘存储中。对于非并行备份和还原操作,必须通过网络将数据从网段发送到主服务器,主服务器将所有数据写入其存储中。除了将I/O限制在一台主机之外,非并行备份还要求主服务器具有足够的本地磁盘存储空间来存储整个数据库。
1.1 使用gpbackup和gprestore的并行备份
gpbackup 和 gprestore 是Greenplum数据库备份和还原实例,采用MVCC机制来保障备份的数据,库级一致性。避免原来需要锁pg_class exclusive的问题。需要锁定元数据(catelog AccessShareLock),同时对备份对象加AccessShareLock锁,不允许drop已有的表,Alter已有的表结构,truncate已有表等操作(只允许AccessShareLock不冲突的操作)。但是可以在备份启动并加载完所有的accessshare lock后新增表以及对新增的表做任何DDL DML操作。
1.2 使用pg_dump进行非并行备份
PostgreSQL的 pg_dump 和 pg_dumpall 非并行备份可用于在master主机上创建单个转储文件,其中包含来自所有活动段的所有数据。
PostgreSQL非并行备份仅应在特殊情况下使用。它们比使用Greenplum备份要慢得多,因为所有数据都必须通过master数据库。另外,通常情况下,master主机的磁盘空间不足,无法保存整个分布式Greenplum数据库的备份。
pg_restore 需要由创建的压缩转储文件 pg_dump/ pg_dumpall。开始还原之前,应该修改 CREATE TABLE 转储文件中的语句以包含Greenplum DISTRIBUTED 子句。如果不包括DISTRIBUTED子句,Greenplum数据库分配默认值,该值可能不是最佳值。
要使用并行备份文件执行非并行还原,可以将备份文件从每个段主机复制到主服务器主机,然后通过master服务器加载它们。
备份Greenplum数据库数据的另一种非并行方法是使用 复制到 SQL命令,用于将表的全部或部分从数据库复制到master主机上的文本文件中。
二、安装
2.1 gpbackup&gprestore
需要从Pivotal Network下载适用于的Greenplum数据库版本和OS平台的最新Pivotal Greenplum Backup and Restore软件发行版。
将安装包上传至master节点进行安装
gppkg -i pivotal_greenplum_backup_restore-1.17.0-1-gp6-rhel-x86_64.gppkg
2.2 pg_dump&pg_restore
postgres软件自带,无需单独安装。
三、gpbackup&gprestore
3.1 要求和限制
gpbackup 和 gprestore 与以下Greenplum数据库版本兼容:
- Pivotal Greenplum数据库4.3.22及更高版本
- Pivotal Greenplum数据库5.5.0及更高版本
- Pivotal Greenplum数据库6.0.0及更高版本
gpbackup和 gprestore 有以下限制:
-
如果在父分区表上创建索引, gpbackup不会在父级的子分区表上备份相同的索引,因为在子级上创建相同的索引会导致错误。如果是交换分区,gpbackup不会检测到交换分区上的索引是从新的父表继承的。在这种情况下,gpbackup 备份冲突 create index 语句,在还原备份集时会导致错误。
-
可以执行多个 gpbackup实例,但每次执行都需要不同的时间戳。
-
当前数据库对象过滤仅限于schemas和tables。
-
备份分区表时,其中一些或所有叶分区与根分区处于不同的数据库中,叶分区表定义将作为元数据备份。即使备份操作指定应排除包含叶分区的数据库,也会发生这种情况。在这种情况下,要控制为此类型的分区表备份的数据,需要使用–leaf-partition-data 选项
- 如果–leaf-partition-data 未指定,则即使备份操作指定应排除叶分区数据库,也将备份叶分区数据。
- 如果 --leaf-partition-data 被指定,则如果备份操作指定应排除叶分区模式,则不备份叶分区数据。仅备份叶分区表的元数据。
-
如果使用 gpbackup --single-data-file 选项以将表备份合并到每个段的单个文件中,则无法使用以下命令执行并行还原操作 gprestore (无法设置 --job 大于1的值)。
-
不能使用 --exclude-table-file 与 --leaf-partition-data。尽管可以在使用以下命令指定的文件中指定叶分区名称–exclude-table-file, gpbackup 忽略分区名称。
-
执行gpbackup备份数据库同时运行DDL命令可能会导致 gpbackup失败,以确保备份集内的一致性。例如,如果在备份操作开始后删除了表,gpbackup 退出并显示错误消息 。错误:关系< schema.table >不存在。
由于表锁定问题,在备份操作期间删除表时,gpbackup可能会失败。gpbackup生成要备份的表列表,并获取表上的访问共享锁。如果表上持有独占锁,则gpbackup将在释放现有锁后获取访问共享锁。如果gpbackup尝试获取表上的锁时该表不再存在,则gpbackup将退出并显示错误消息。
对于在备份过程中可能会删除的表,可以使用 gpbackup 表过滤选项,例如 --exclude-table 或者-exclude-schema。
-
使用 gpbackup创建的备份只能还原到具有与源群集相同数量的段实例的Greenplum数据库群集。如果执行gpexpand 将分段添加到群集,在扩展完成后无法还原在开始扩展之前所做的备份。
3.2 备份的对象
下表列出了备份和还原对象 gpbackup和 gprestore。将使用指定的数据库备份数据库对象–dbname选项。默认情况下,也会备份全局对象(Greenplum数据库系统对象),但是仅当包含–with-globals对于 gprestore
数据库(用于指定的数据库 --dbname) | 全局(要求 --with-globals 恢复选项) |
---|---|
[Schemas) | Databases |
Procedural language extensions | Database-wide configuration parameter settings (GUCs) |
Sequences | Resource group definitions |
Comments | Resource queue definitions |
Tables | Roles |
Indexes | GRANT assignments of roles to databases |
Owners | |
Writable External Tables (DDL only) | |
Readable External Tables (DDL only) | |
Functions | |
Aggregates | |
Casts | |
Types | |
Views | |
Materialized Views (DDL only) | |
Protocols | |
Triggers. (While Greenplum Database does not support triggers, any trigger definitions that are present are backed up and restored.) | |
Rules | |
Domains | |
Operators, operator families, and operator classes | |
Conversions | |
Extensions | |
Text search parsers, dictionaries, templates, and configurations |
注意:这些数据库不包含在备份中。
- gp_toolkit
- information_schema
- pg_aoseg
- pg_bitmapindex
- pg_catalog
- pg_toast *
- pg_temp *
当还原到现有数据库时,当存在public数据库,gprestore将对象还原到public数据库。当还原到新数据库(使用–create db选项)时,gprestore在使用create database命令创建数据库时自动创建public数据库。该命令使用包含公共数据库的template0数据库。
3.3 备份
-dbname database_name
需要。指定要备份的数据库。
-backupdir 目录
可选的。将所有必需的备份文件(元数据文件和数据文件)复制到指定的目录。必须将目录指定为绝对路径(不是相对路径)。如果不提供此选项,则会在$ MASTER_DATA_DIRECTORY / backups / YYYYMMDD / YYYYMMDDhhmmss / 目录中的Greenplum Database主机上创建元数据文件 。段主机在<seg_dir> / backups / YYYYMMDD / YYYYMMDDhhmmss /目录中创建CSV数据文件 。指定自定义备份目录时,会将文件复制到备份目录的子目录中的这些路径。
-data只
可选的。仅将表数据备份到CSV文件中,但不备份重新创建表和其他数据库对象所需的元数据文件。
-debug
可选的。在操作期间显示详细的调试消息。
-exclude-schema schema_name
可选的。指定要从备份中排除的数据库模式。可以多次指定此选项以排除多个模式。无法将此选项与-include-模式选项。
-exclude-table-file file_name
可选的。指定包含要从备份中排除的表列表的文本文件。文本文件中的每一行都必须使用该格式定义一个表 <模式名称> <表名>。该文件不得包含尾随行。如果表或模式名称使用小写字母,数字或下划线字符以外的任何字符,则必须在双引号中包含该名称。
不能结合使用此选项 -leaf分区数据。虽然可以在指定的文件中指定叶子分区名称 -exclude表文件, gpbackup 忽略分区名称。
-include-schema schema_name
可选的。指定要包括在备份中的数据库模式。可以多次指定此选项以包含多个模式。如果指定此选项,则后续未包含的任何模式-include-模式备份集中省略了选项。无法将此选项与 -exclude-模式选项。
-include-table-file file_name
可选的。指定包含要包括在备份中的表列表的文本文件。文本文件中的每一行都必须使用该格式定义一个表 <模式名称> <表名>。该文件不得包含尾随行。如果表或模式名称使用小写字母,数字或下划线字符以外的任何字符,则必须在双引号中包含该名称。备份集中将省略此文件中未列出的任何表。
可以选择指定表叶子分区名称来代替表名称,以便在备份中仅包含特定叶子分区 -leaf分区数据 选项。
--leaf-partition-data
可选的。对于分区表,为每个叶子分区创建一个数据文件,而不是为整个表创建一个数据文件(默认值)。使用此选项还可以指定要包含在备份中的单个叶子分区 -include表文件选项。不能结合使用此选项-exclude表文件。
--metadata-only
可选的。仅创建重新创建数据库对象所需的元数据文件(DDL),但不备份实际的表数据。
--no-compression
可选的。不要压缩表数据CSV文件。
--quiet
可选的。禁止所有非警告,非错误日志消息。
-verbose
可选的。打印详细日志消息。
--version
可选的。打印版本号并退出。
--with-stats
可选的。在备份集中包含查询计划统计信息。
3.3.1 全量备份
要执行数据库以及Greenplum Database系统元数据的完整备份:
[aaa@qq.com gpseg-1]$ gpbackup --dbname gpdw --backup-dir /data/backup/ --leaf-partition-data
20200514:00:01:43 gpbackup:gpadmin:node1:026445-[INFO]:-Starting backup of database gpdw
20200514:00:01:43 gpbackup:gpadmin:node1:026445-[INFO]:-Backup Timestamp = 20200514000143
20200514:00:01:43 gpbackup:gpadmin:node1:026445-[INFO]:-Backup Database = gpdw
20200514:00:01:43 gpbackup:gpadmin:node1:026445-[INFO]:-Gathering table state information
20200514:00:01:43 gpbackup:gpadmin:node1:026445-[INFO]:-Acquiring ACCESS SHARE locks on tables
Locks acquired: 2 / 2 [================================================================] 100.00% 0s
20200514:00:01:43 gpbackup:gpadmin:node1:026445-[INFO]:-Gathering additional table metadata
20200514:00:01:43 gpbackup:gpadmin:node1:026445-[INFO]:-Getting partition definitions
20200514:00:01:43 gpbackup:gpadmin:node1:026445-[INFO]:-Getting storage information
20200514:00:01:43 gpbackup:gpadmin:node1:026445-[INFO]:-Getting child partitions with altered schema
20200514:00:01:43 gpbackup:gpadmin:node1:026445-[INFO]:-Metadata will be written to /data/backup/gpseg-1/backups/20200514/20200514000143/gpbackup_20200514000143_metadata.sql
20200514:00:01:43 gpbackup:gpadmin:node1:026445-[INFO]:-Writing global database metadata
20200514:00:01:43 gpbackup:gpadmin:node1:026445-[INFO]:-Global database metadata backup complete
20200514:00:01:43 gpbackup:gpadmin:node1:026445-[INFO]:-Writing pre-data metadata
20200514:00:01:44 gpbackup:gpadmin:node1:026445-[INFO]:-Pre-data metadata backup complete
20200514:00:01:44 gpbackup:gpadmin:node1:026445-[INFO]:-Writing post-data metadata
20200514:00:01:44 gpbackup:gpadmin:node1:026445-[INFO]:-Post-data metadata backup complete
20200514:00:01:44 gpbackup:gpadmin:node1:026445-[INFO]:-Writing data to file
Tables backed up: 2 / 2 [=============================================================] 100.00% 34s
20200514:00:02:18 gpbackup:gpadmin:node1:026445-[INFO]:-Data backup complete
20200514:00:02:19 gpbackup:gpadmin:node1:026445-[INFO]:-Found neither /usr/local/greenplum-db/./bin/gp_email_contacts.yaml nor /home/gpadmin/gp_email_contacts.yaml
20200514:00:02:19 gpbackup:gpadmin:node1:026445-[INFO]:-Email containing gpbackup report /data/backup/gpseg-1/backups/20200514/20200514000143/gpbackup_20200514000143_report will not be sent
20200514:00:02:19 gpbackup:gpadmin:node1:026445-[INFO]:-Backup completed successfully
上面的命令在指定目录会创建一个包含全局和特定于数据库的元数据的文件,否则默认目录的Greenplum数据库主主机上的如下目录。
$MASTER_DATA_DIRECTORY/backup/<YYYYMMDD>/<YYYYMMDDHHMMSS>/
[aaa@qq.com gpseg-1]$ ll /data/backup/gpseg-1/backups/20200514/20200514000143/
总用量 20
-r--r--r-- 1 gpadmin gpadmin 660 5月 14 00:02 gpbackup_20200514000143_config.yaml
-r--r--r-- 1 gpadmin gpadmin 2765 5月 14 00:01 gpbackup_20200514000143_metadata.sql
-r--r--r-- 1 gpadmin gpadmin 1823 5月 14 00:02 gpbackup_20200514000143_report
-r--r--r-- 1 gpadmin gpadmin 4467 5月 14 00:02 gpbackup_20200514000143_toc.yaml
段节点也会在相同的目录生成备份文件,每个段都将用于备份的每个表的数据存储在单独的压缩CSV文件中, 否则会在如下目录
seg datadir/backups/<YYYYMMDD>/<YYYYMMDDHHMMSS>/
[aaa@qq.com ~]# ll /data/backup/gpseg1/backups/20200514/20200514000143/
总用量 386352
-rw------- 1 gpadmin gpadmin 20 5月 14 00:01 gpbackup_1_20200514000143_24649.gz
-rw------- 1 gpadmin gpadmin 395617108 5月 14 00:02 gpbackup_1_20200514000143_24652.gz
注意:备份实例化视图不会备份实例化视图数据。仅备份实例化视图定义。
3.3.2 增量备份
gpbackup 和 gprestore支持创建追加优化表的增量备份以及从增量备份还原。仅当表已更改时,增量备份才会备份所有指定的堆表,并备份追加优化的表(包括追加优化的,面向列的表)。例如,如果追加优化表的一行已更改,则将备份该表。对于分区的附加优化表,仅备份更改的叶子分区。
当追加优化表或表分区中已更改的数据总量与自上次备份以来未更改的数据相比较小时,增量备份将非常有效。
仅当上次完全备份或增量备份之后对表执行了以下操作之一时,增量备份才会备份追加优化的表:
- ALTER TABLE
- DELETE
- INSERT
- TRUNCATE
- UPDATE
- DROP and then re-create the table
增量备份集包括以下备份:
- 完整备份。这是增量备份所基于的完整备份。
- 增量备份集,用于从完整备份开始捕获对数据库的更改。
基于全备插入一条数据,执行增量备份
使用以下命令创建了增量备份:
[aaa@qq.com gpseg-1]$ gpbackup --dbname gpdw --backup-dir /data/backup/ --leaf-partition-data --incremental
20200514:00:10:27 gpbackup:gpadmin:node1:026900-[INFO]:-Starting backup of database gpdw
20200514:00:10:28 gpbackup:gpadmin:node1:026900-[INFO]:-Backup Timestamp = 20200514001027
20200514:00:10:28 gpbackup:gpadmin:node1:026900-[INFO]:-Backup Database = gpdw
20200514:00:10:28 gpbackup:gpadmin:node1:026900-[INFO]:-Gathering table state information
20200514:00:10:28 gpbackup:gpadmin:node1:026900-[INFO]:-Acquiring ACCESS SHARE locks on tables
Locks acquired: 2 / 2 [================================================================] 100.00% 0s
20200514:00:10:28 gpbackup:gpadmin:node1:026900-[INFO]:-Gathering additional table metadata
20200514:00:10:28 gpbackup:gpadmin:node1:026900-[INFO]:-Getting partition definitions
20200514:00:10:28 gpbackup:gpadmin:node1:026900-[INFO]:-Getting storage information
20200514:00:10:28 gpbackup:gpadmin:node1:026900-[INFO]:-Getting child partitions with altered schema
20200514:00:10:28 gpbackup:gpadmin:node1:026900-[INFO]:-Metadata will be written to /data/backup/gpseg-1/backups/20200514/20200514001027/gpbackup_20200514001027_metadata.sql
20200514:00:10:28 gpbackup:gpadmin:node1:026900-[INFO]:-Writing global database metadata
20200514:00:10:28 gpbackup:gpadmin:node1:026900-[INFO]:-Global database metadata backup complete
20200514:00:10:28 gpbackup:gpadmin:node1:026900-[INFO]:-Writing pre-data metadata
20200514:00:10:28 gpbackup:gpadmin:node1:026900-[INFO]:-Pre-data metadata backup complete
20200514:00:10:28 gpbackup:gpadmin:node1:026900-[INFO]:-Writing post-data metadata
20200514:00:10:28 gpbackup:gpadmin:node1:026900-[INFO]:-Post-data metadata backup complete
20200514:00:10:28 gpbackup:gpadmin:node1:026900-[INFO]:-Basing incremental backup off of backup with timestamp = 20200514000143
20200514:00:10:28 gpbackup:gpadmin:node1:026900-[INFO]:-Writing data to file
Tables backed up: 2 / 2 [=============================================================] 100.00% 34s
20200514:00:11:02 gpbackup:gpadmin:node1:026900-[INFO]:-Data backup complete
20200514:00:11:03 gpbackup:gpadmin:node1:026900-[INFO]:-Found neither /usr/local/greenplum-db/./bin/gp_email_contacts.yaml nor /home/gpadmin/gp_email_contacts.yaml
20200514:00:11:03 gpbackup:gpadmin:node1:026900-[INFO]:-Email containing gpbackup report /data/backup/gpseg-1/backups/20200514/20200514001027/gpbackup_20200514001027_report will not be sent
20200514:00:11:03 gpbackup:gpadmin:node1:026900-[INFO]:-Backup completed successfully
在该示例中,完整备份具有时间戳20200514000143,20200514001027是增量备份。
[aaa@qq.com gpseg-1]$ gpbackup_manager list-backups
timestamp date database type object filtering plugin duration date deleted
20200514001027 Thu May 14 2020 00:10:27 gpdw incremental 00:00:35
20200514000143 Thu May 14 2020 00:01:43 gpdw full 00:00:35
要基于最新的增量备份创建新的增量备份,必须包含相同的内容。
–backup-dir 选项作为增量备份以及选项
-叶分区数据 和
增加的
gpbackup --dbname mytest --backup-dir / mybackup --leaf-partition-data --incremental
可以指定 --from-timestamp选项以基于现有的增量或完整备份创建增量备份。
[aaa@qq.com gpseg-1]$ gpbackup --dbname gpdw --backup-dir /data/backup/ --leaf-partition-data --incremental --from-timestamp 20200514001027
20200514:00:18:13 gpbackup:gpadmin:node1:027308-[INFO]:-Starting backup of database gpdw
20200514:00:18:13 gpbackup:gpadmin:node1:027308-[INFO]:-Backup Timestamp = 20200514001813
20200514:00:18:13 gpbackup:gpadmin:node1:027308-[INFO]:-Backup Database = gpdw
20200514:00:18:13 gpbackup:gpadmin:node1:027308-[INFO]:-Gathering table state information
20200514:00:18:13 gpbackup:gpadmin:node1:027308-[INFO]:-Acquiring ACCESS SHARE locks on tables
Locks acquired: 2 / 2 [================================================================] 100.00% 0s
20200514:00:18:13 gpbackup:gpadmin:node1:027308-[INFO]:-Gathering additional table metadata
20200514:00:18:13 gpbackup:gpadmin:node1:027308-[INFO]:-Getting partition definitions
20200514:00:18:13 gpbackup:gpadmin:node1:027308-[INFO]:-Getting storage information
20200514:00:18:13 gpbackup:gpadmin:node1:027308-[INFO]:-Getting child partitions with altered schema
20200514:00:18:13 gpbackup:gpadmin:node1:027308-[INFO]:-Metadata will be written to /data/backup/gpseg-1/backups/20200514/20200514001813/gpbackup_20200514001813_metadata.sql
20200514:00:18:13 gpbackup:gpadmin:node1:027308-[INFO]:-Writing global database metadata
20200514:00:18:13 gpbackup:gpadmin:node1:027308-[INFO]:-Global database metadata backup complete
20200514:00:18:13 gpbackup:gpadmin:node1:027308-[INFO]:-Writing pre-data metadata
20200514:00:18:13 gpbackup:gpadmin:node1:027308-[INFO]:-Pre-data metadata backup complete
20200514:00:18:13 gpbackup:gpadmin:node1:027308-[INFO]:-Writing post-data metadata
20200514:00:18:14 gpbackup:gpadmin:node1:027308-[INFO]:-Post-data metadata backup complete
20200514:00:18:14 gpbackup:gpadmin:node1:027308-[INFO]:-Basing incremental backup off of backup with timestamp = 20200514001027
20200514:00:18:14 gpbackup:gpadmin:node1:027308-[INFO]:-Writing data to file
Tables backed up: 2 / 2 [=============================================================] 100.00% 35s
20200514:00:18:49 gpbackup:gpadmin:node1:027308-[INFO]:-Data backup complete
20200514:00:18:50 gpbackup:gpadmin:node1:027308-[INFO]:-Found neither /usr/local/greenplum-db/./bin/gp_email_contacts.yaml nor /home/gpadmin/gp_email_contacts.yaml
20200514:00:18:50 gpbackup:gpadmin:node1:027308-[INFO]:-Email containing gpbackup report /data/backup/gpseg-1/backups/20200514/20200514001813/gpbackup_20200514001813_report will not be sent
20200514:00:18:50 gpbackup:gpadmin:node1:027308-[INFO]:-Backup completed successfull
[aaa@qq.com gpseg-1]$ gpbackup_manager list-backups
timestamp date database type object filtering plugin duration date deleted
20200514001813 Thu May 14 2020 00:18:13 gpdw incremental 00:00:36
20200514001027 Thu May 14 2020 00:10:27 gpdw incremental 00:00:35
20200514000143 Thu May 14 2020 00:01:43 gpdw full 00:00:35
3.4 恢复
使用 gprestore从备份集还原,必须使用 --timestamp 选项以指定确切的时间戳记值(YYYYMMDDHHMMSS) 恢复。 如果数据库在群集中不存在,则选择–create-db,如果备份指定–backup-dir,则恢复时也需要指定 --backup-dir 。gprestore默认情况下不尝试还原Greenplum系统的全局元数据。如果需要,请使用–with-globals。默认gprestore使用1个连接来还原表数据和元数据。如果的备份集很大,则可以通过增加并行连接数–jobs 来提高还原性能。
[aaa@qq.com gpseg-1]$ psql postgres
psql (9.4.24)
Type "help" for help.
postgres=# drop user dbdream;
DROP ROLE
postgres=# drop tablespace space1;
DROP TABLESPACE
postgres=# drop tablespace space2;
DROP TABLESPACE
postgres=# drop tablespace space3;
DROP TABLESPACE
postgres=# \q
[aaa@qq.com gpseg-1]$ dropdb gpdw
[aaa@qq.com gpseg-1]$ gprestore --backup-dir /data/backup/ --timestamp 20200514001813 --create-db --with-globals -jobs 8
20200514:00:24:01 gprestore:gpadmin:node1:027722-[INFO]:-Restore Key = 20200514001813
20200514:00:24:02 gprestore:gpadmin:node1:027722-[INFO]:-Restoring global metadata
Global objects restored: 25 / 25 [=====================================================] 100.00% 2s
20200514:00:24:04 gprestore:gpadmin:node1:027722-[INFO]:-Global database metadata restore complete
20200514:00:24:05 gprestore:gpadmin:node1:027722-[INFO]:-Restoring pre-data metadata
Pre-data objects restored: 10 / 10 [===================================================] 100.00% 0s
20200514:00:24:05 gprestore:gpadmin:node1:027722-[INFO]:-Pre-data metadata restore complete
Tables restored: 2 / 2 [============================================================] 100.00% 2m57s
20200514:00:27:02 gprestore:gpadmin:node1:027722-[INFO]:-Data restore complete
20200514:00:27:02 gprestore:gpadmin:node1:027722-[INFO]:-Restoring post-data metadata
Post-data objects restored: 1 / 1 [====================================================] 100.00% 0s
20200514:00:27:02 gprestore:gpadmin:node1:027722-[INFO]:-Post-data metadata restore complete
20200514:00:27:03 gprestore:gpadmin:node1:027722-[INFO]:-Found neither /usr/local/greenplum-db/./bin/gp_email_contacts.yaml nor /home/gpadmin/gp_email_contacts.yaml
20200514:00:27:03 gprestore:gpadmin:node1:027722-[INFO]:-Email containing gprestore report /data/backup/gpseg-1/backups/20200514/20200514001813/gprestore_20200514001813_20200514002401_report will not be sent
20200514:00:27:03 gprestore:gpadmin:node1:027722-[INFO]:-Restore completed successfully
[aaa@qq.com gpseg-1]$ psql
psql (9.4.24)
Type "help" for help.
gpdw=# select count(*) from t1;
count
-------
2
(1 row)
gpdw=# select count(*) from t2;
count
-----------
110000000
(1 row)
注意:不能使用 gpbackup 选项 --single-data-file执行并行还原操作gprestore 如果备份合并表将每个段备份到单个文件。
恢复视图不会还原实例化视图数据。仅还原实例化视图定义。要用数据填充实例化视图,请使用刷新材料视图。刷新实例化视图时,实例化视图定义引用的表必须可用。gprestore 日志文件列出了已还原的实例化视图以及 刷新材料视图 用于用数据填充实例化视图的命令。
从增量备份还原时, gprestore 还列出了还原操作中使用的备份 gprestore 日志文件。
在还原操作期间, gprestore 如果完全备份或其他所需的增量备份不可用,则显示错误。
要创建增量备份或从增量备份集还原数据,需要完整的备份集。归档增量备份时,必须归档完整的备份集。必须归档在主数据库和所有段上创建的所有文件。
每一次 gpbackup 运行时,该实用程序将备份信息添加到历史文件 gpbackup_history.yaml在Greenplum数据库主数据目录中。该文件包括备份选项和其他备份信息。
如果不指定 --from-timestamp 创建增量备份时选择 gpbackup使用具有一组一致选项的最新备份。该实用程序将检查备份历史记录文件,以找到具有一致选项集的备份。如果该实用程序找不到具有一致选项集的备份,或者历史文件不存在,gpbackup 显示一条消息,指出必须先创建完整备份,然后才能创建增量文件。
如果指定 --from-timestamp 创建增量备份时选择 gpbackup 确保正在创建的备份的选项与指定备份的选项一致。
gpbackup 选项 --with-stats不必要求备份集中的所有备份都相同。但是,要使用gprestore 选项 --with-stats 要还原统计信息,指定的备份必须已使用 --with-stats 创建备份时。
可以从备份集中的任何备份执行还原操作。但是,增量备份中捕获的更改晚于用于还原数据库数据的备份时,将无法还原。
从增量备份集还原时, gprestore 检查备份,并从备份集中的附录优化表的最新版本中还原每个附录优化表,并从最新备份中还原堆表。
增量备份集,完整备份和关联的增量备份必须位于单个设备上。例如,备份集中的备份必须全部在文件系统上或必须全部在Data Domain系统上。
警告:对Greenplum数据库段配置的更改会使增量备份无效。更改段配置(添加或删除段实例)之后,必须先创建完整备份,然后才能创建增量备份。
3.5 备份信息
执行备份操作时,gpbackup会将备份信息附加到Greenplum数据库主数据目录中的gpbackup_history.yaml文件中。该文件包含备份时间戳、有关备份选项的信息以及增量备份的备份集信息。此文件未由gpbackup备份。
当使用–incremental选项运行gpbackup时,gpbackup使用文件中的信息来查找增量备份的匹配备份,而不指定–from timesamp选项来指示要用作增量备份集中最新备份的备份。
[aaa@qq.com gpseg-1]$ cat gpbackup_history.yaml
backupconfigs:
- backupdir: /data/backup/
backupversion: 1.17.0
compressed: true
databasename: gpdw
databaseversion: 6.7.1 build commit:a21de286045072d8d1df64fa48752b7dfac8c1b7
dataonly: false
datedeleted: ""
excluderelations: []
excludeschemafiltered: false
excludeschemas: []
excludetablefiltered: false
includerelations: []
includeschemafiltered: false
includeschemas: []
includetablefiltered: false
incremental: true
leafpartitiondata: true
metadataonly: false
plugin: ""
pluginversion: ""
restoreplan:
- timestamp: "20200514000143"
tablefqns: []
- timestamp: "20200514001027"
tablefqns: []
- timestamp: "20200514001813"
tablefqns:
- public.t1
- public.t2
singledatafile: false
timestamp: "20200514001813"
endtime: "20200514001849"
withstatistics: false
- backupdir: /data/backup/
backupversion: 1.17.0
compressed: true
databasename: gpdw
databaseversion: 6.7.1 build commit:a21de286045072d8d1df64fa48752b7dfac8c1b7
dataonly: false
datedeleted: ""
excluderelations: []
excludeschemafiltered: false
excludeschemas: []
excludetablefiltered: false
includerelations: []
includeschemafiltered: false
includeschemas: []
includetablefiltered: false
incremental: true
leafpartitiondata: true
metadataonly: false
plugin: ""
pluginversion: ""
restoreplan:
- timestamp: "20200514000143"
tablefqns: []
- timestamp: "20200514001027"
tablefqns:
- public.t1
- public.t2
singledatafile: false
timestamp: "20200514001027"
endtime: "20200514001102"
withstatistics: false
- backupdir: /data/backup/
backupversion: 1.17.0
compressed: true
databasename: gpdw
databaseversion: 6.7.1 build commit:a21de286045072d8d1df64fa48752b7dfac8c1b7
dataonly: false
datedeleted: ""
excluderelations: []
excludeschemafiltered: false
excludeschemas: []
excludetablefiltered: false
includerelations: []
includeschemafiltered: false
includeschemas: []
includetablefiltered: false
incremental: false
leafpartitiondata: true
metadataonly: false
plugin: ""
pluginversion: ""
restoreplan:
- timestamp: "20200514000143"
tablefqns:
- public.t1
- public.t2
singledatafile: false
timestamp: "20200514000143"
endtime: "20200514000218"
withstatistics: false
3.6 返回码
在gpbackup或者 gprestore完成后返回的状态码含义
- 0 –备份或还原已完成,没有任何问题
- 1 –备份或还原已完成,但非致命错误。
- 2 –备份或还原失败,并出现致命错误。
3.7 筛选备份或还原的内容
gpbackup 备份指定数据库中的所有数据库和表,除非使用数据库级或表级过滤器选项排除或包括单个数据库或表对象。
模式级别选项是 --include-schema 或者–exclude-schema
$ gpbackup --dbname gpdw --include-schema test
$ gpbackup --dbname gpdw --include-table-file /home/gpadmin/table-list.txt
可以结合 -include模式 与 --exclude-table 要么 --exclude-table-file进行备份。这个例子使用 --include模式 与 --exclude-table 备份除单个表以外的其他模式。
$ gpbackup --dbname gpdw --include-schema test --exclude-table mydata.addresses
不能结合 --include模式 与 --include-table 要么 --include-table-file,并且无法合并 -排除模式 使用任何表过滤选项,例如 --exclude-table 要么 --include-table。
使用时 --include-table 要么 --include-table-file 从属对象不会自动备份或还原,必须显式指定所需的从属对象。例如,如果备份或还原视图或实例化视图,则还必须指定该视图或实例化视图使用的表。如果备份或还原使用顺序的表,则还必须指定顺序。
3.7.1 叶分区过滤
gpbackup为段上的每个表创建一个文件。可以指定–leaf-partition-data选项可为分区表的每个叶分区创建一个数据文件,而不是单个文件。还可以通过在要包括的文本文件中列出叶分区名称来筛选到特定叶分区的备份。例如,考虑使用以下语句创建的表:
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"
要仅备份一年最后一个季度的数据,请首先创建一个文本文件,该文件列出这些叶分区名称而不是完整的表名称:
public.sales_1_prt_oct17
public.sales_1_prt_nov17
public.sales_1_prt_dec17
然后使用 --include-table-file
每个叶分区生成一个数据文件的选项:
$ gpbackup --dbname gpdw --include-table-file last-quarter.txt --leaf-partition-data
当指定 --leaf-partition-data,gpbackup备份分区表时,每个叶分区生成一个数据文件。例如,此命令为每个叶分区生成一个数据文件:
$ gpbackup --dbname gpdw --include-table public.sales --leaf-partition-data
备份叶分区时,叶分区数据与整个分区表的元数据一起备份。
注意:不能使用–exclude-table-file 与选项 -叶分区数据。尽管可以在使用以下命令指定的文件中指定叶分区名称–exclude-table-file, gpbackup 忽略分区名称。
3.7.2 gprestore过滤
使用gpbackup创建备份集后,可以使用gprestore–include schema和–include table file选项筛选要从备份集中还原的架构和表。这些选项的工作方式与gpbackup对应选项相同,但有以下限制:
试图还原的表在数据库中不能已存在。
如果尝试还原备份集中不存在的架构或表,则不会执行gprestore。
如果使用–include schema选项,gprestore将无法还原依赖于多个架构的对象。
如果使用–include table file选项,gprestore不会创建角色或设置表的所有者。该实用程序还原表索引和规则。触发器也会还原,但Greenplum数据库不支持。
使用–include table file指定的文件不能包含叶分区名称,当使用gpbackup指定此选项时可以这样做。如果在备份集中指定了叶分区,请指定分区表以还原叶分区数据。
当还原包含来自分区表的某些叶分区的数据的备份集时,分区表将与叶分区的数据一起还原。例如,使用gpbackup选项创建备份——include table file,文本文件列出分区表的一些叶分区。还原备份将创建分区表,并仅还原文件中列出的叶分区的数据。
3.8 备份文件
警告:全部gpbackup元数据文件是使用只读权限创建的。切勿删除或修改元数据文件gpbackup 备份集。这样做会使备份文件无法正常工作。
完整备份集 gpbackup 包括多个元数据文件,支持文件和CSV数据文件,每个文件都有创建备份的时间戳。
默认情况下,元数据和支持文件存储在Greenplum数据库master主机的$MASTER_DATA_DIRECTORY/backups/YYYYMMDD/YYYYMMDDHHMMSS/目录中。如果指定自定义备份目录,则将同一文件路径创建为备份目录的子目录。下表描述了元数据和支持文件的名称和内容。
3.8.1 gpbackup元数据文件
文件名 | 描述 |
---|---|
gpbackup_ _metadata.sql | 包含全局和特定于数据库的元数据: DDL用于Greenplum数据库集群中全局的对象,而不是集群中特定数据库所拥有的对象。 备份数据库中对象的DDL(指定为 --dbname)在还原实际数据之前必须创建的对象,以及在 还原数据之后必须创建的对象的DDL 。 全局对象包括: Tablespaces Databases Database-wide configuration parameter settings (GUCs) Resource group definitions Resource queue definitions Roles GRANT assignments of roles to databases Note: Global metadata is not restored by default. You must include the --with-globals option to the gprestore command to restore global metadata. Database-specific objects that must be created before to restoring the actual data include: Session-level configuration parameter settings (GUCs) Schemas Procedural language extensions Types Sequences Functions Tables Protocols Operators and operator classes Conversions Aggregates Casts Views Materialized Views Note: Materialized view data is not restored, only the definition. Constraints Database-specific objects that must be created after restoring the actual data include: Indexes Rules Triggers. (While Greenplum Database does not support triggers, any trigger definitions that are present are backed up and restored.) |
gpbackup_ _toc.yaml | 包含用于在_predata.sql和_postdata.sql文件中定位对象DDL的元数据 。该文件还包含表名和OID,这些表名和OID用于在每个段上创建的CSV数据文件中定位相应的表数据。 |
gpbackup_ _报告 | 包含有关备份操作的信息,该信息用于填充备份完成后发送的电子邮件通知(如果已配置)。 |
gpbackup_ _config.yaml | 包含有关特定备份任务执行的元数据,包括:gpbackup 版数据库名称Greenplum数据库版本其他选项设置,例如 -无压缩, -压缩级别, -仅元数据, -仅数据和 --with-stats。 |
gpbackup_history.yaml | 包含有关使用以下命令创建备份时使用的选项的信息 gpbackup,以及有关增量备份的信息。存储在Greenplum数据库主数据目录中的Greenplum数据库主主机上。该文件不由备份 gpbackup。 |
3.8.2 段数据文件
默认情况下,每个段都为该段上备份的每个表创建一个压缩的CSV文件。可以选择指定-单个数据文件选项,以便在每个段上创建一个数据文件。文件存储在 <seg_dir> / backups / YYYYMMDD / YYYYMMDDHHMMSS /中。
如果指定自定义备份目录,则段数据文件将作为备份目录的子目录复制到同一文件路径。如果包括 -叶分区数据 选项, gpbackup 为分区表的每个叶分区创建一个数据文件,而不是为文件创建一个表。
每个数据文件使用文件名格式 gpbackup_ <content_id> _ _ .gz,其中:
- <content_id>是该段的内容ID。
- 是其的时间戳 gpbackup 操作。
- 是表的对象ID。元数据文件 gpbackup_ _toc.yaml引用此 在数据库中查找特定表的数据。
可以选择使用(1-9)指定gzip压缩级别 -压缩级别 选项,或完全禁用压缩 -无压缩。如果未指定压缩级别, gpbackup 默认情况下使用压缩级别1。
四、pgdump&pgrestore
在Greenplum中,我们可以使用 gp_restore 或者 gpdbrestore 对数据库进行并行恢复,但是并行恢复要求要恢复的新集群与备份集群拥有同样的配置(节点实例数量)。但是如果我们的新集群节点数与原集群不一样怎么办?还能使用原备份文件吗?答案是肯定的,但是由于节点数量不一样了,我们只能通过Master节点进行非并行备份。
数据库的导入导出是最常用的功能之一,每种数据库都提供有这方面的工具,例如Oracle的exp/imp,Informix的dbexp/dbimp,MySQL的mysqldump,而PostgreSQL提供的对应工具为pg_dump和pg_restore。
pg_dump是用于备份PostgreSQL数据库的工具。它可以在数据库正在使用的时候进行完整一致的备份,并不阻塞其它用户对数据库的访问。
转储格式可以是一个脚本或者归档文件。转储脚本的格式是纯文本,包含许多SQL命令,这些SQL命令可以用于重建该数据库并将之恢复到保存脚本时的状态。可以使用 psql从这样的脚本中恢复。它们甚至可以用于在其它机器甚至是其它硬件体系的机器上重建数据库,通过对脚本进行一些修改,甚至可以在其它SQL数据库产品上重建数据库。
归档文件格式必须和pg_restore一起使用重建数据库。它们允许pg_restore对恢复什么东西进行选择,甚至是在恢复之前对需要恢复的条目进行重新排序。归档文件也是可以跨平台移植的。
pg_dump 把一个数据库转储为纯文本文件或者是其它格式.
用法: pg_dump [选项]... [数据库名字]
一般选项:
-f, --file=FILENAME output file or directory name
-F, --format=c|d|t|p output file format (custom, directory, tar, plain text)
-v, --verbose 详细模式
-Z, --compress=0-9 被压缩格式的压缩级别
--lock-wait-timeout=TIMEOUT 在等待表锁超时后操作失败
--help 显示此帮助信息, 然后退出
--versoin 输出版本信息, 然后退出
控制输出内容选项:
-a, --data-only 只转储数据,不包括模式
-b, --blobs 在转储中包括大对象
-c, --clean 在重新创建之前,先清除(删除)数据库对象
-C, --create 在转储中包括命令,以便创建数据库
-E, --encoding=ENCODING 转储以ENCODING形式编码的数据
-n, --schema=SCHEMA 只转储指定名称的模式
-N, --exclude-schema=SCHEMA 不转储已命名的模式
-o, --oids 在转储中包括 OID
-O, --no-owner 在明文格式中, 忽略恢复对象所属者
-s, --schema-only 只转储模式, 不包括数据
-S, --superuser=NAME 在转储中, 指定的超级用户名
-t, --table=TABLE 只转储指定名称的表
-T, --exclude-table=TABLE 只转储指定名称的表
-x, --no-privileges 不要转储权限 (grant/revoke)
--binary-upgrade 只能由升级工具使用
--column-inserts 以带有列名的INSERT命令形式转储数据
--disable-dollar-quoting 取消美元 (符号) 引号, 使用 SQL 标准引号
--disable-triggers 在只恢复数据的过程中禁用触发器
--inserts 以INSERT命令,而不是COPY命令的形式转储数据
--no-security-labels do not dump security label assignments
--no-tablespaces 不转储表空间分配信息
--no-unlogged-table-data do not dump unlogged table data
--quote-all-identifiers quote all identifiers, even if not key words
--serializable-deferrable wait until the dump can run without anomalies
--use-set-session-authorization
使用 SESSION AUTHORIZATION 命令代替ALTER OWNER 命令来设置所有权
联接选项:
-h, --host=主机名 数据库服务器的主机名或套接字目录
-p, --port=端口号 数据库服务器的端口号
-U, --username=名字 以指定的数据库用户联接
-w, --no-password 永远不提示输入口令
-W, --password 强制口令提示 (自动)
--role=ROLENAME do SET ROLE before dump
如果没有提供数据库名字, 那么使用 PGDATABASE 环境变量的数值.
pg_restore 从一个归档中恢复一个由 pg_dump 创建的 PostgreSQL 数据库.
用法:
pg_restore [选项]... [文件名]
一般选项:
-d, --dbname=名字 连接数据库名字
-f, --file=文件名 输出文件名
-F, --format=c|d|t backup file format (should be automatic)
-l, --list 打印归档文件的 TOC 概述
-v, --verbose 详细模式
--help 显示此帮助信息, 然后退出
--version 输出版本信息, 然后退出恢复控制选项:
-a, --data-only 只恢复数据, 不包括模式
-c, --clean 在重新创建数据库对象之前需要清除(删除)数据库对象
-C, --create 创建目标数据库
-e, --exit-on-error 发生错误退出, 默认为继续
-I, --index=名称 恢复指定名称的索引
-j, --jobs=NUM 可以执行多个任务并行进行恢复工作
-L, --use-list=文件名 从这个文件中使用指定的内容表排序输出
-n, --schema=NAME 在这个模式中只恢复对象
-O, --no-owner 忽略恢复对象所属者
-P, --function=名字(参数) 恢复指定名字的函数
-s, --schema-only 只恢复模式, 不包括数据
-S, --superuser=NAME 使用指定的超级用户来禁用触发器
-t, --table=NAME 恢复指定命字的表
-T, --trigger=NAME 恢复指定命字的触发器
-x, --no-privileges 跳过处理权限的恢复 (grant/revoke)
-1, --single-transaction 作为单个事务恢复
--disable-triggers 在只恢复数据的过程中禁用触发器
--no-data-for-failed-tables 没有恢复无法创建表的数据
--no-security-labels do not restore security labels
--no-tablespaces 不恢复表空间的分配信息
--use-set-session-authorization 使用 SESSION AUTHORIZATION 命令代替ALTER OWNER命令来设置对象所有权
联接选项:
-h, --host=主机名 数据库服务器的主机名或套接字目录
-p, --port=端口号 数据库服务器的端口号
-U, --username=名字 以指定的数据库用户联接
-w, --no-password 永远不提示输入口令
-W, --password 强制口令提示 (自动)
--role=ROLENAME 在恢复前执行SET ROLE操作
如果没有提供输入文件名, 则使用标准输入.
pg_dump进行单个数据库的备份,而pg_dumpall备份一个给出的集群中的每个数据库,同时还确保保留象用户和组这样的全局数据状态。