openGauss数据库源码解析系列文章——备份恢复机制:openGauss增量备份技术(上)
上篇图文,我们分享了备份恢复机制—openGauss全量备份技术的精彩内容,本篇将详细介绍备份恢复机制—openGauss增量备份技术的相关内容。
10.2 openGauss增量备份技术
全量备份每次备份都需要复制全部数据库的文件,备份时间和存储空间的开销都比较大。增量备份只备份自上次备份以来的数据改变,可以减少备份的开销。
openGauss增量备份工具为gs_probackup。gs_probackup支持全量备份、增量备份、对备份元数据进行管理、设置备份的留存策略、合并增量备份、删除过期备份,并且可备份外部目录的内容,如脚本文件、配置文件、日志文件、dump文件等。
增量备份需要数据库服务器端的配合,在conf文件中配置参数enable_cbm_tracking = on,启动数据库服务器对脏页数据修改的跟踪。
增量备份的主要逻辑在gs_probackup工具中实现,一些备份原理和前面介绍的全量物理备份相似,下面主要介绍gs_probackup工具的代码实现逻辑。源代码在src\bin\pg_probackup目录下,gs_probackup是一个独立的二进制工具,有自己的主函数,主函数在pg_probackup.cpp文件中。主函数是增量备份处理的一个框架,开始时调用pgBackupInit初始化当前备份的元数据信息,然后调用init_config初始化实例的备份配置信息,解析备份子命令和命令行参数,根据子命令调用子命令的处理函数进行处理。
10.2.1 gs_probackup子命令
gs_probackup支持的功能、子命令和处理函数如下。
(1) 打印gs_probackup版本,代码如下:
gs_probackup -V|--version gs_probackup version
这个子命令没有处理函数,直接打印显示当前版本号。
(2) 显示gs_probackup命令的帮助信息。如果指定了gs_probackup的子命令,则显示可用于此子命令的参数的详细信息。代码如下:
gs_probackup -?|--help gs_probackup help [command]
处理函数为help_command和help_pg_probackup。
(3) 初始化备份路径backup-path中的备份目录,该目录将存储备份的内容。如果备份路径backup-path已存在,则backup-path必须为空目录。代码如下:
gs_probackup init -B backup-path [--help]
处理函数为do_init。
(4) 在备份路径backup-path内初始化一个新的备份实例,并生成pg_probackup.conf配置文件,该文件保存了指定数据目录pgdata-path的gs_probackup设置。代码如下:
gs_probackup add-instance -B backup-path -D pgdata-path --instance=instance_name [-E external-directories-paths] [remote_options] [--help]
处理函数为do_add_instance。
(5) 在备份路径backup-path内删除指定实例相关的备份内容,代码如下:
gs_probackup del-instance -B backup-path --instance=instance_name [--help]
处理函数为do_delete_instance。
(6) 将指定的连接、压缩、日志等相关设置添加到pg_probackup.conf配置文件中,或修改已设置的值,不要手动编辑pg_probackup.conf配置文件。代码如下:
gs_probackup set-config -B backup-path --instance=instance_name [-D pgdata-path] [-E external-directories-paths] [--restore-command=cmdline] [--archive-timeout=timeout] [--retention-redundancy=retention-redundancy] [--retention-window=retention-window] [--wal-depth=wal-depth] [--compress-algorithm=compress-algorithm] [--compress-level=compress-level] [-d dbname] [-h hostname] [-p port] [-U username] [logging_options] [remote_options] [--help]
处理函数为do_set_config。
(7) 将备份相关设置添加到backup.control配置文件中,或修改已设置的值。代码如下:
gs_probackup set-backup -B backup-path --instance=instance_name -i backup-id [--note=text] [pinning_options] [--help]
处理函数为do_set_backup。
(8) 显示位于备份目录中的pg_probackup.conf配置文件的内容。可以通过指定--format=json选项,以json格式显示。默认情况下,显示为纯文本格式,代码如下:
gs_probackup show-config -B backup-path --instance=instance_name [--format=plain|json] [--help]
处理函数为do_show_config。
(9) 显示备份目录的内容。如果指定了instance_name和backup_id,则显示该备份的详细信息。可以通过指定--format=json选项,以json格式显示。默认情况下,备份目录的内容显示为纯文本格式,代码如下:
gs_probackup show -B backup-path [--instance=instance_name [-i backup-id]] [--archive] [--format=plain|json] [--help]
处理函数为do_show。
(10) 创建指定实例的备份,代码如下:
gs_probackup backup -B backup-path --instance=instance_name -b backup-mode [-D pgdata-path] [-C] [-S slot-name] [--temp-slot] [--backup-pg-log] [-j threads_num] [--progress] [--no-validate] [--skip-block-validation] [-E external-directories-paths] [--no-sync] [--note=text] [--archive-timeout=timeout] [logging_options] [retention_options] [compression_options] [connection_options] [remote_options] [pinning_options] [--help]
处理函数为do_backup。
(11) 从备份目录backup-path中的备份副本恢复指定实例。如果指定了恢复目标选项,gs_probackup将查找最近的备份并将其还原到指定的恢复目标。否则,使用最近一次备份,代码如下:
gs_probackup restore -B backup-path --instance=instance_name [-D pgdata-path] [-i backup_id] [-j threads_num] [--progress] [--force] [--no-sync] [--no-validate] [--skip-block-validation] [--external-mapping=OLDDIR=NEWDIR] [-T OLDDIR=NEWDIR] [--skip-external-dirs] [-I incremental_mode] [recovery_options] [remote_options] [logging_options] [--help]
处理函数为do_restore_or_validate。
(12) 将指定的增量备份与其父完全备份之间的所有增量备份合并到父完全备份。父完全备份将接收所有合并的数据,而已合并的增量备份将作为冗余被删除。代码如下:
gs_probackup merge -B backup-path --instance=instance_name -i backup_id [-j threads_num] [--progress] [logging_options] [--help]
处理函数为do_merge。
(13) 删除指定备份,或删除不满足当前保留策略的备份,代码如下:
gs_probackup delete -B backup-path --instance=instance_name [-i backup-id | --delete-expired | --merge-expired | --status=backup_status] [--delete-wal] [-j threads_num] [--progress] [--retention-redundancy=retention-redundancy] [--retention-window=retention-window] [--wal-depth=wal-depth] [--dry-run] [logging_options] [--help]
处理函数为do_delete,do_retention和do_delete_status。
(14) 验证恢复数据库所需的所有文件是否存在且未损坏。如果未指定instance_name,gs_probackup将验证备份目录中的所有可用备份。如果指定instance_name而不指定任何附加选项,gs_probackup将验证此备份实例的所有可用备份。如果指定了instance_name并且指定backup-id或恢复目标相关选项,gs_probackup将检查是否可以使用这些选项恢复数据库。代码如下:
gs_probackup validate -B backup-path [--instance=instance_name] [-i backup-id] [-j threads_num] [--progress] [--skip-block-validation] [--recovery-target-time=time | --recovery-target-xid=xid | --recovery-target-lsn=lsn | --recovery-target-name=target-name] [--recovery-target-inclusive=boolean] [--recovery-target-timeline=timeline] [logging_options] [--help]
处理函数为do_validate_all和do_restore_or_validate。
gs_probackup在执行各个子命令处理函数之前,需要解析各个命令的命令行参数,gs_probackup支持的命令行参数如表1所示。
表1 命令行参数
参数 | 类别 | 描述 |
Command | 通用参数 | gs_probackup除version和help以外的子命令:init、add-instance、del-instance、set-config、set-backup、show-config、show、backup、restore、merge、delete、validate |
-?, --help | 通用参数 | 显示gs_probackup命令行参数的帮助信息,然后退出。子命令中只能使用--help,不能使用-? |
-V, --version | 通用参数 | 打印gs_probackup版本,然后退出 |
-B backup-path, --backup-path=backup-path | 通用参数 | 备份的路径。 系统环境变量:$BACKUP_PATH |
-D pgdata-path, --pgdata=pgdata-path | 通用参数 | 数据目录的路径。 系统环境变量:$PGDATA |
--instance =instance_name | 通用参数 | 实例名 |
-i backup-id, --backup-id=backup-id | 通用参数 | 备份的唯一标识 |
--format=format | 通用参数 | 指定显示备份信息的格式,支持plain和json格式。 默认值:plain |
--status =backup_status | 通用参数 | 删除指定状态的所有备份 |
-j threads_num, --threads=threads_num | 通用参数 | 设置备份、还原、合并进程的并行线程数 |
--archive | 通用参数 | 显示WAL归档信息 |
--progress | 通用参数 | 显示进度 |
--note=text | 通用参数 | 给备份添加note |
-b backup-mode, --backup-mode=backup-mode | 备份参数 | 指定备份模式,支持FULL和PTRACK。 FULL:创建全量备份,全量备份包含所有数据文件 PTRACK:创建PTRACK增量备份 |
-C, --smooth-checkpoint | 备份参数 | 将检查点在一段时间内完成。默认情况下,gs_probackup会尝试尽快完成检查点 |
-S slot-name, --slot=slot-name | 备份参数 | 指定WAL流处理的复制槽 |
--temp-slot | 备份参数 | 在备份的实例中为WAL流处理创建一个临时物理复制槽,它确保在备份过程中,所有所需的WAL段仍然是可用的。默认的slot名为pg_probackup_slot,可通过选项--slot/-S更改 |
--backup-pg-log | 备份参数 | 将日志目录包含到备份中。此目录通常包含日志消息,默认情况下不包含日志目录 |
-E external-directories-paths, --external-dirs=external-directories-paths | 备份参数 | 将指定的目录包含到备份中。此选项对于备份位于数据目录外部的脚本、SQL转储和配置文件很有用。如果要备份多个外部目录,请在UNIX上用冒号分隔它们的路径,如-E /tmp/dir1:/tmp/dir2 |
--skip-block-validation | 备份参数 | 关闭块级校验,加快备份速度 |
--no-validate | 备份参数 | 在完成备份后跳过自动验证 |
--no-sync | 备份参数 | 不将备份文件同步到磁盘 |
--archive-timeout=timeout | 备份参数 | 以秒为单位设置流式处理的超时时间。 默认值:300 |
-I, --incremental-mode=none|checksum|lsn | 恢复参数 | 若PGDATA中可用的有效页没有修改,则重新使用他们。 默认值:none |
--external-mapping=OLDDIR=NEWDIR | 恢复参数 | 在恢复时,将包含在备份中的外部目录从OLDDIR重新定位到NEWDIR目录。OLDDIR和NEWDIR都必须是绝对路径。如果路径中包含“=”,则使用反斜杠转义。此选项可为多个目录多次指定 |
-T OLDDIR=NEWDIR, --tablespace-mapping=OLDDIR=NEWDIR | 恢复参数 | 在恢复时,将表空间从OLDDIR重新定位到NEWDIR目录。OLDDIR和NEWDIR必须都是绝对路径。如果路径中包含“=”,则使用反斜杠转义。多个表空间可以多次指定此选项。此选项必须和--external-mapping一起使用 |
--skip-external-dirs | 恢复参数 | 跳过备份中包含的使用--external-dirs选项指定的外部目录。这些目录的内容将不会被恢复 |
--skip-block-validation | 恢复参数 | 跳过块级校验,以加快验证速度。在恢复之前的自动验证期间,将仅做文件级别的校验 |
--no-validate | 恢复参数 | 跳过备份验证 |
--force | 恢复参数 | 允许忽略备份的无效状态。如果出于某种原因需要从损坏的或无效的备份中恢复数据,可以使用此标志。请谨慎使用 |
--recovery-target=immediate|latest | 恢复目标参数 | 恢复目标参数:如果配置了连续的WAL归档,则可以和restore命令一起使用这些参数,定义何时停止恢复。 immediate:当达到指定备份的一致性状态后,停止恢复;如果省略-i/--backup_id参数,则恢复到最新的可用的备份之后,停止恢复。 latest:持续进行恢复,直到应用了所有存档中的所有可用的WAL段。 --recovery-target的默认值取决于要恢复的备份的WAL传输方式,STREAM流备份为immediate,归档模式为latest |
--recovery-target-timeline=timeline | 恢复目标参数 | 指定要恢复到的timeline。缺省情况下,使用指定备份的timeline |
--recovery-target-lsn=lsn | 恢复目标参数 | 指定要恢复到的lsn |
--recovery-target-name=target-name | 恢复目标参数 | 指定要将数据恢复到的已命名的保存点 |
--recovery-target-time=time | 恢复目标参数 | 指定要恢复到的时间 |
--recovery-target-xid=xid | 恢复目标参数 | 指定要恢复到的事务ID |
--recovery-target-inclusive=boolean | 恢复目标参数 | 当该参数指定为true时,恢复目标将包括指定的内容。 当该参数指定为false时,恢复目标将不包括指定的内容。 该参数必须和--recovery-target-name、--recovery-target-time、--recovery-target-lsn或--recovery-target-xid一起使用 |
--recovery-target-action=pause|promote|shutdown | 恢复目标参数 | 指定恢复至目标时,服务器应执行的操作 |
--restore-command=cmdline | 恢复目标参数 | 指定恢复相关的命令。 例如:--restore-command='cp /mnt/server/archivedir/%f "%p"' |
--retention-redundancy=retention-redundancy | 备份留存参数 | 备份留存相关参数:可以和backup和delete命令一起使用这些参数。指定在数据目录中留存的完整备份数。必须为正整数。0表示禁用此设置。 默认值:0 |
--retention-window=retention-window | 备份留存参数 | 指定留存的天数。必须为正整数。0表示禁用此设置。 默认值:0 |
--wal-depth=wal-depth | 备份留存参数 | 每个时间轴上必须留存的执行PITR能力的最新有效备份数。必须为正整数。0表示禁用此设置。 默认值:0 |
--delete-wal | 备份留存参数 | 从任何现有的备份中删除不需要的WAL文件 |
--delete-expired | 备份留存参数 | 删除不符合pg_probackup.conf配置文件中定义的留存策略的备份 |
--merge-expired | 备份留存参数 | 将满足留存策略要求的最旧的增量备份与其已过期的父备份合并 |
--dry-run | 备份留存参数 | 显示所有可用备份的当前状态,不删除或合并过期备份 |
--ttl=interval | 备份留存参数 | 指定从恢复时间开始计算,备份要留存的时间量。必须为正整数。0表示取消备份固定。 支持的单位:ms,s,min,h,d(默认为s)。例如:--ttl=30d。 将某些备份从已建立的留存策略中排除,可以和backup和set-backup命令一起使用这些参数 |
--expire-time=time | 备份留存参数 | 指定备份留存失效的时间戳。必须是ISO-8601标准的时间戳。 例如:--expire-time='2020-01-01 00:00:00+03' |
--log-level-console=log-level-console | 日志参数 | 日志级别:verbose、log、info、warning、error和off。设置要发送到控制台的日志级别。每个级别都包含其后的所有级别。级别越高,发送的消息越少。指定off级别表示禁用控制台日志记录。 默认值:info |
--log-level-file=log-level-file | 日志参数 | 设置要发送到日志文件的日志级别。每个级别都包含其后的所有级别。级别越高,发送的消息越少。指定off级别表示禁用日志文件记录。 默认值:off |
--log-filename=log-filename | 日志参数 | 指定要创建的日志文件的文件名。文件名可以使用strftime模式,因此可以使用%-escapes指定随时间变化的文件名。 例如,如果指定了“pg_probackup-%u.log”模式,则pg_probackup为每周的每一天生成单独的日志文件,其中%u替换为相应的十进制数字,即pg_probackup-1.log表示星期一;pg_probackup-2.log表示星期二,以此类推。 如果指定了--log-level-file参数启用日志文件记录,则该参数有效。 默认值:"pg_probackup.log" |
--error-log-filename=error-log-filename | 日志参数 | 指定仅用于error日志的日志文件名。指定方式与--log-filename参数相同。此参数用于故障排除和监视 |
--log-directory=log-directory | 日志参数 | 指定创建日志文件的目录。必须是绝对路径。此目录会在写入第一条日志时创建。 默认值:$BACKUP_PATH/log |
--log-rotation-size=log-rotation-size | 日志参数 | 指定单个日志文件的最大值。如果达到此值,则启动gs_probackup命令后,日志文件将循环,但help和version命令除外。0表示禁用基于文件大小的循环。 支持的单位:KB、MB、GB、TB(默认为KB)。 默认值:0 |
--log-rotation-age=log-rotation-age | 日志参数 | 单个日志文件的最大生命周期。如果达到此值,则启动gs_probackup命令后,日志文件将循环,但help和version命令除外。$BACKUP_PATH/log/log_rotation目录下保存最后一次创建日志文件的时间。0表示禁用基于时间的循环。 支持的单位:ms,s,min,h,d(默认为min)。 默认值:0 |
-d dbname, --pgdatabase=dbname | 连接参数 | 指定要连接的数据库名称。该连接仅用于管理备份进程,因此您可以连接到任何现有的数据库。如果命令行、PGDATABASE环境变量或pg_probackup.conf配置文件中没有指定此参数,则gs_probackup会尝试从PGUSER环境变量中获取该值。如果未设置PGUSER变量,则从当前用户名获取。系统环境变量:$PGDATABASE |
-h hostname, --pghost=hostname | 连接参数 | 指定运行服务器的系统的主机名。如果该值以斜杠开头,则被用作UNIX域套接字的路径。 系统环境变量:$PGHOST。 默认值:local socket |
-p port, --pgport=port | 连接参数 | 指定服务器正在侦听连接的TCP端口或本地UNIX域套接字文件扩展名。 系统环境变量:$PGPORT。 默认值:5432 |
-U username, --pguser=username | 连接参数 | 指定所连接主机的用户名。 系统环境变量:$PGUSER |
-w, --no-password | 连接参数 | 不出现输入密码提示。如果主机要求密码认证并且密码没有通过其他形式给出,则连接尝试将会失败。该选项在批量工作和不存在用户输入密码的脚本中很有帮助 |
-W, --password | 连接参数 | 强制出现输入密码提示 |
--compress-algorithm=compress-algorithm | 压缩参数 | 可以和backup命令一起使用这些参数,指定用于压缩数据文件的算法。 compress-algorithm取值包括zlib、pglz和none。如果设置为zlib或pglz,此选项将启用压缩。默认情况下,压缩功能处于关闭状态。 默认值:none |
--compress-level=compress-level | 压缩参数 | compress-level指定压缩级别。取值范围:0~9。 0表示无压缩; 1表示压缩比最小,处理速度最快; 9表示压缩比最大,处理速度最慢; 可与--compress-algorithm选项一起使用。 默认值:1 |
--remote-proto=protocol | 远程模式参数 | 通过SSH远程运行gs_probackup操作的相关参数。可以和add-instance、set-config、backup、restore命令一起使用这些参数。 指定用于远程操作的协议。目前只支持SSH协议。取值包括: SSH:通过SSH启用远程备份模式,这是默认值。 none:显式禁用远程模式。 如果指定了--remote-host参数,可以省略此参数 |
--remote-host=destination | 远程模式参数 | 指定要连接的远程主机的IP地址或主机名 |
--remote-port=port | 远程模式参数 | 指定要连接的远程主机的端口号。 默认值:22 |
--remote-user=username | 远程模式参数 | 指定SSH连接的远程主机用户。如果省略此参数,则使用当前发起SSH连接的用户。 默认值:当前用户 |
--remote-path=path | 远程模式参数 | 指定gs_probackup在远程系统的安装目录。 默认值:当前路径 |
--ssh-options=ssh_options | 远程模式参数 | 指定SSH命令行参数的字符串。 例如:--ssh-options='-c cipher_spec -F configfile' |
以上内容为备份恢复机制:openGauss增量备份技术的部分内容,由于此部分内容较多,下篇图文将接着分享“openGauss增量备份技术”的其余内容,敬请期待!

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
测试角色在项目各阶段的项目管理tips
作者:京东物流 宋雪薇 1 前言 项目管理是一个繁杂的过程,每个阶段需要涉及到不同人员、资源的协调配合。每个角色都有自己的定位和任务,为了紧密配合项目经理或无分配项目经理运行项目的场景下确保项目成员共同达成项目目标,不同的角色掌握相应的项目管理意识就尤为重要。 那么,测试角色作为项目交付的质量把控者,具备相应的项目管理意识在项目的高质量、高效率交付目标上有着重要作用,如前置识别质量风险、进度风险等。本文旨在梳理、谈论测试角色在项目各阶段如何评估测试范围及风险、前置暴露问题以及推进测试进度等项目管理事项,高效协作及交付测试角色产物,最终与项目各方共同推进达到高质量、高效率交付的目标。 2 现状及思考 在现有敏捷迭代快速交付模式下,针对某一需求/项目会拆分至各个团队,各个团队节奏及交付目标不完全一致,且无项目经理角色跟踪推进的情况下,存在后置与协作团队沟通确认事项,如:未拉齐依赖方排期、前期未识别出改动系统、需求/设计变更未及时同步相关方、无设计方案沟通导致提测内容不满足提测标准,等均可影响交付节奏。那么作为测试角色的我们可以做哪些事情? 核心主旨:高效沟通协作,提前思考后续阶段较容易影响...
- 下一篇
8000+字,就说一个字Volatile
文章整理自 博学谷狂野架构师 简介 volatile是Java提供的一种轻量级的同步机制。Java 语言包含两种内在的同步机制:同步块(或方法)和 volatile 变量,相比于synchronized(synchronized通常称为重量级锁),volatile更轻量级,因为它不会引起线程上下文的切换和调度。但是volatile 变量的同步性较差(有时它更简单并且开销更低),而且其使用也更容易出错。 Java volatile关键字用于将Java变量标记为“存储在主存储器中”。更确切地说,这意味着,每次读取一个volatile变量都将从计算机的主内存中读取,而不是从CPU缓存中读取,并且每次写入volatile变量都将写入主内存,而不仅仅是CPU缓存。 实际上,自Java 5以来,volatile关键字保证的不仅仅是向主存储器写入和读取volatile变量。我将在以下部分解释。 特性 可以把对volatile变量的单个读/写,看成是使用同一个锁对这些单个读/写操作做了同步 当我们声明共享变量为volatile后,对这个变量的读/写将会很特别。理解volatile特性的一个好方法是:把...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2全家桶,快速入门学习开发网站教程
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- 2048小游戏-低调大师作品
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- CentOS7,8上快速安装Gitea,搭建Git服务器
- CentOS6,CentOS7官方镜像安装Oracle11G
- CentOS关闭SELinux安全模块