目录
前言
备份和恢复概述
并行备份
非并行备份
需求和限制
前言
定期执行备份能确保在数据损坏或者系统失效发生时能恢复数据或者重建数据库系统。用户还可以使用备份从一个数据库系统迁移数据到另一个数据库系统。
备份和恢复概述
数据库支持并行和非并行的方法来备份和恢复数据库。 并行操作的规模不受系统中实例数量的影响,因为每台主机都同时把其数据写入到本地的磁盘存储上。 如果使用非并行备份和恢复操作,数据必须通过网络从实例被发送到master,后者把所有的数据写入它的存储中。除了把I/O限制在一台主机上之外,非并行备份要求master拥有足够的本地磁盘存储以保存整个数据库。
并行备份
gpbackup和gprestore是数据库的备份和恢复工具。 gpbackup在每个独立的表级别使用ACCESS SHARE锁,而不是在pg_class表里加EXCLUSIVE锁。 这使得你可以在备份期间执行DML语句, 如CREATE,ALTER,DROP和TRUNCATE操作,只要这些操作没有执行在备份的数据上。默认情况下,gpbackup仅在数据库master数据目录中存储备份的对象元数据文件和DDL文件。数据库节点使用COPY ... ON SEGMENT命令将备份表的数据存储在位于每个节点的backups目录中的压缩CSV数据文件中。元数据备份文件包含gprestore并行恢复完整备份集所需的所有信息。 备份元数据还提供了在gprestore的未来版本中仅用于还原数据集中的单个对象以及任何依赖对象的框架。将表数据存储在CSV文件中还提供了使用其他恢复工具(如gpload)在同一群集或其他群集中加载数据的机会。 默认情况下,为节点上的每个表创建一个文件。 您可以使用gpbackup指定--leaf-partition-data选项,以便为分区表的每个叶子分区创建一个数据文件,而不是单个文件。 此选项还允许您按叶分区筛选备份集。
每个gpbackup任务都使用数据库中的单个事务。 在此事务期间,元数据将在master主机上备份,并且每个节点主机上的每个表的数据将使用COPY ... ON SEGMENT命令并行写入CSV备份文件。 备份进程在备份的每个表上获取ACCESS SHARE锁。
非并行备份
pg_dump和pg_dumpall非并行备份工具可以用来在master主机上创建一个单独的,包含所有节点数据的dump文件。非并行工具应该在特殊场合使用。 它们比使用gpbackup工具要慢得多,因为所有数据都必须通过master。 此外,通常情况是master主机没有足够的磁盘空间来保存整个分布式数据库的备份。pg_restore工具需要pg_dump或pg_dumpall创建的压缩dump文件。 在开始还原之前,应修改dump文件中的CREATE TABLE语句以包含DISTRIBUTED子句。如果您不包含DISTRIBUTED子句,数据库会分配默认值,这可能不是最佳值。使用并行的备份文件来做一个非并行的恢复,可以从每个实例节点拷贝备份文件到master节点,然后通过master加载它们。
需求和限制
gpbackup和gprestore有如下限制:
-
如果在父分区表上创建索引,则gpbackup不会在父分区的子分区表上备份相同的索引,因为在子分区上创建相同的索引会导致错误。但是,如果您交换分区,则gpbackup不会检测到交换分区上的索引是从新父表继承的。 在这种情况下,gpbackup备份冲突的CREATE INDEX语句,这会在还原备份集时导致错误
-
可以执行gpbackup的多个实例,但每次执行都需要不同的时间戳
-
数据库对象过滤目前仅限于schema和表
-
如果使用gpbackup --single-data-file选项将表备份组合到每个节点的单个文件中, 则无法使用gprestore执行并行还原操作
-
不能将--exclude-table-file与--leaf-partition-data一起使用。 虽然可以在使用--exclude-table-file指定的文件中指定叶子分区名称,但gpbackup会忽略分区名称
- 在运行DDL命令的同时使用gpbackup备份数据库可能会导致gpbackup失败。如果gpbackup尝试获取表上的锁时表不再存在,则gpbackup将退出并显示错误消息。对于可能在备份期间删除的表,可以使用gpbackup表过滤选项(例如--exclude-table或--exclude-schema)从备份中排除表
-
使用gpexpand创建的备份只能还原到与源集群具有相同数量的节点实例的数据库集群。 如果运行gpexpand将节点添加到集群,则在扩容完成后无法恢复在扩容之前所做的备份