暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

pgBackRest使用指南(一)

飞象数据 2018-01-08
2562

1、介绍

pgBackRest是一个PostgreSQL数据库备份和恢复的管理插件,本文是它的用户使用指南。它的安装说明请参照《pgBackRest安装指南》。

2、快速启动

在快速启动章节将介绍backrest和PostgreSQL的主要配置并介绍备份、恢复和info命令。

2.1 安装演示集群

创建演示集群的操作过程是可选的,但是强烈推荐使用,特别是对于新用户。在用户指南的实例命令中引用了演示集群,实例假定演示集群的运行端口为5432。

集群当前还不能启动直到下一章节,因为这里还有一些配置要做。

db-master⇒ 创建一个演示集群

$ sudo -u postgres usr/lib/postgresql/9.4/bin/initdb -D var/lib/postgresql/9.4/demo -k -A peer
$ sudo pg_createcluster 9.4 demo
Configuring already existing cluster (configuration: etc/postgresql/9.4/demo, data: var/lib/postgresql/9.4/demo, owner: 5000:5000)
Ver Cluster Port Status Owner    Data directory               Log file9.4 demo    5432 down   postgres var/lib/postgresql/9.4/demo var/log/postgresql/postgresql-9.4-demo.log

默认PostgreSQL能够接受本地连接。手册中的示例需要监听从其他服务器创建的连接,因此listen_addresses被配置成监听所有端口。

db-master:/etc/postgresql/9.4/demo/postgresql.conf=>设置isten_addresses

listen_addresses = '*'

为了达到演示的目的,参数配置log_line_prefix被最小化配置,这样可以使日志输出尽可能地简短,以便更好地说明重要信息。

db-master:/etc/postgresql/9.4/demo/postgresql.conf=> 设置log_line_prefix参数

listen_addresses = '*'
log_line_prefix = ''

2.2 配置Cluster Stanza

Cluster Stanza通常要指定PostgreSQL数据库的位置、如何备份以及归档选项等信息。大多数的数据库服务器只有一个数据库实例,因此只需要1个stanza,而备份服务器将为每一个数据库实例预备一个stanza用来备份。

使用数据库实例来命名stanza文件是很不错的,但是更好地是命名方式是说明数据库包含在哪一个数据库实例中。

由于stanza的名称适用于所有的副本,因此选择可以描述数据库实例实际功能的名字更为合适,如app、dw等,而不是用本地实例名称,如main、prod等。

‘demo’这个名字准确的描述了这个集群的目的,这样也可以成为一个好的stanza名称。

pgBackRest需要知道PostgreSQL实例被安装在什么位置。这个位置可以直接从PostgreSQL请求。在使用pgBackRest工具进行备份的过程中,向pgBackRest提供的实例路径将与PostgreSQL运行的路径进行比较,它们必须是相等的,否则备份将返回错误。因此需要确保db-path的配置必须和postgresql.conf中data_directory的配置完全一样。

数据库的拥有者(通常是postgres)对于创建的配置文件/etc/pgbackrest.conf必须有读权限。

db-master:/etc/pgbackrest.conf ⇒配置PostgreSQL实例的数据目录

[demo]
db-path=/var/lib/postgresql/9.4/demo

pgBackRest的配置文件遵循Windows INI文件格式的约定。各节由括号中的文本表示,每个部分包含键/值对。以#开头的行被忽略,可以作为注释使用。

2.3 创建转储文件

转储文件就是指pgBackRest存储备份和归档WAL的位置。

如果你是首次创建备份,很难估算你将需要多少磁盘空间。最好就是做一些备份,然后记录下不同类型备份(full/incr/diff)的大小,并确定每天产生的wal的数量。这会让你大致了解你每天需要多大的空间来备份,当然,随着数据库的运行,空间大小需要也会随之发生变化。对于这个演示实例,转储文件将和数据库实例存放在同一台服务器上,这是最简单的配置并且在使用传统备份软件备份数据库主机的情况是很有用的。

db-master ⇒ 创建pgBackRest转储文件

$ sudo mkdir var/lib/pgbackrest
$ sudo chmod 750 var/lib/pgbackrest
$ sudo chown postgres:postgres var/lib/pgbackrest

转储文件路径必须被配置为了让pgBackRest工具知道去哪里找他。

db-master:/etc/pgbackrest.conf ⇒配置pgBackRest工具转储文件路径。

[demo]
db-path=/var/lib/postgresql/9.4/demo
[global]
repo-path=/var/lib/pgbackrest

2.4 创建 Stanza

使用stanza-create命令在转储文件所在主机上执行去初始化stanza。建议在执行完stanza-create命令之后去运行检查命令确保归档和备份被正确配置。db-master ⇒ 创建stanza并检查配置

sudo -u postgres pgbackrest --stanza=demo --log-level-console=info stanza-create
P00   INFO: stanza-create command begin 1.23: --db1-path=/var/lib/postgresql/9.4/demo --log-level-console=info --no-log-timestamp --repo-path=/var/lib/pgbackrest --stanza=demo
P00   INFO: stanza-create command end: completed successfully

2.5 配置归档

备份一个正在运行的PostgreSQL实例需要配置开启WAL归档。请注意,及时没有对数据库集群进行显示写入,在备份过程中也会产生至少一个WAL段。

db-master:/etc/postgresql/9.4/demo/postgresql.conf ⇒ 配置归档参数

archive_command = 'pgbackrest --stanza=demo archive-push %p'
archive_mode = on
listen_addresses = '*'
log_line_prefix = ''
max_wal_senders = 3
wal_level = hot_standby

Wal_level参数至少被设置成minimum,设置成为hot_standby和logical也可以进行正常备份。即使当前并没有搭建数据库主备环境,把wal_level设置成为hot_standy并且把max_wal_senders设置成为更大的数也是一个好主意,因为一旦后续对数据集添加备库节点,那么数据库不需要重启实例。

数据库实例在修改了这些参数后需要重启实例才能进行一个备份。

db-master ⇒ 重启数据库实例

sudo pg_ctlcluster 9.4 demo restart

将wal文件进行归档时,如果预计归档花费将超过60秒(默认值),那么就需要延长archive-timeout了。

2.6 配置保留

pgBackRest保留备份时间主要依赖于retention选项的配置。

db-master:/etc/pgbackrest.conf ⇒ 配置保留全库备份2个。

[demo]
db-path=/var/lib/postgresql/9.4/demo
[global]
repo-path=/var/lib/pgbackrest
retention-full=2

更多的信息请查阅第四章保留章节。

2.7 检查配置

pgBackRest的check命令用于检查用于归档备份的archive_command命令是否配置正确。他会检查错误的配置,尤其是所需的WAL没有正确归档会导致备份不完整的归档命令的配置。该命令可以在数据库主机或备份主机上运行。这个命令也可以运行在备库,但是由于pg_switch_xlog()/pg_switch_wal()不能在备库运行,所以这个命令只能测试存储库的配置。

pg_create_restore_point(‘pgBackRestArchive Check’)和pg_switch_xlog()/pg_switch_wal()命令在归档WAL段的时候会被强制调用。恢复点只在PostgreSQL版本9.1之后才支持,因此对于旧版本的数据库,如果自上次检查以来wal文件还没有进行过切换,则检查命令会失败。因此在上次检查以来wal没有进行切换的情况下,建议用户由用户进行切换活动。

db-master ⇒ 检查配置

$ sudo -u postgres pgbackrest --stanza=demo --log-level-console=info check
P00   INFO: check command begin 1.23: --db1-path=/var/lib/postgresql/9.4/demo --log-level-console=info --log-level-stderr=off --no-log-timestamp --repo-path=/var/lib/pgbackrest --stanza=demo
P00   INFO: WAL segment 000000010000000000000001 successfully stored in the archive at '/var/lib/pgbackrest/archive/demo/9.4-1/0000000100000000/000000010000000000000001-7d20ff5ccb2c12584f1710a9a546f5afcc8e8ac5.gz'
P00   INFO: check command end: completed successfully

2.8 执行备份

通过执行pgBackRest的备份命令来执行PostgreSQL实例的备份。db-master ⇒ 备份演示数据库实例

$ sudo -u postgres pgbackrest --stanza=demo --log-level-console=info backup
P00   INFO: backup command begin 1.23: --db1-path=/var/lib/postgresql/9.4/demo --log-level-console=info --log-level-stderr=off --no-log-timestamp --repo-path=/var/lib/pgbackrest --retention-full=2 --stanza=demo
P00   WARN: no prior backup exists, incr backup has been changed to full
P00   INFO: execute exclusive pg_start_backup() with label "pgBackRest backup started at 2017-09-03 21:34:27": backup begins after the next regular checkpoint completes
P00   INFO: backup start archive = 000000010000000000000002, lsn = 0/2000028
       [filtered 757 lines of output]
P01   INFO: backup file var/lib/postgresql/9.4/demo/base/1/11895 (0B, 100%)
P01   INFO: backup file var/lib/postgresql/9.4/demo/base/1/11885 (0B, 100%)
P00   INFO: full backup size = 19.3MB
P00   INFO: execute exclusive pg_stop_backup() and wait for all WAL segments to archive
P00   INFO: backup stop archive = 000000010000000000000002, lsn = 0/20000F0
       [filtered 4 lines of output]

默认情况下,pgBackRest会执行增量备份。但是增量备份必须在全量备份的基础上进行,因此在没有全量备份的情况下,pgBackRest会执行全量备份。Type选项可以被用来指定全量备份和增量备份的备份类型。

$ sudo -u postgres pgbackrest --stanza=demo --type=diff --log-level-console=info backup
       [filtered 4 lines of output]
P01   INFO: backup file var/lib/postgresql/9.4/demo/global/pg_control (8KB, 97%) checksum 9724470ec0b9e4f126a303d4845bf11d05eb6404
P01   INFO: backup file var/lib/postgresql/9.4/demo/backup_label (236B, 100%) checksum fb318e319e75661bf1d7954cf7a7eec88b9a16b4
P00   INFO: diff backup size = 8.2KB
P00   INFO: execute exclusive pg_stop_backup() and wait for all WAL segments to archive
P00   INFO: backup stop archive = 000000010000000000000003, lsn = 0/30000F0
       [filtered 4 lines of output]

这次执行差异备份没有警告因为全库备份已经存在了。虽然增量备份可以基于完整备份或差异备份,但差异备份必须基于完整备份。可以通过运行-type=full的备份命令来执行完整备份。

更多的信息请查阅第三章保留章节。

2.9 定时备份

备份命令可以被cron等时间调度工具定时执行。在下面的例子中,配置了两个定时任务。每周日上午6:30进行全量备份,每周一到周六的上午6:30分进行差异备份。如果在非周末进行定时任务的设置,那么pgBackRest将在第一次执行差异作业是执行全库备份,之后再进行差异备份。

#m h   dom mon dow   command
30 06  *   *   0     pgbackrest --type=full --stanza=demo backup
30 06  *   *   1-6   pgbackrest --type=diff --stanza=demo backup

一旦设置了定时备份,那么配置备份保留时长也是相当重要的,详见第四章保留章节。

2.10 备份信息

使用info命令获取备份信息db-master ⇒ 获取演示实例的信息

$ sudo -u postgres pgbackrest info
stanza: demo
    status: ok
    db (current)
        wal archive min/max (9.4-1): 000000010000000000000002  000000010000000000000003
        full backup: 20170903-213427F
            timestamp start/stop: 2017-09-03 21:34:27  2017-09-03 21:34:32
            wal start/stop: 000000010000000000000002  000000010000000000000002
            database size: 19.3MB, backup size: 19.3MB
            repository size: 2.2MB, repository backup size: 2.2MB
        diff backup: 20170903-213427F_20170903-213433D
            timestamp start/stop: 2017-09-03 21:34:33  2017-09-03 21:34:36
            wal start/stop: 000000010000000000000003  000000010000000000000003
            database size: 19.3MB, backup size: 8.2KB
            repository size: 2.2MB, repository backup size: 344B
            backup reference list: 20170903-213427F

每一个stanza都有一个单独的部分,可以通过指定—stanza选项来指定输出位置。Stanza中的’ status’ 给出了这个Stanza中健康状况的一个简短说明。如果status为OK,那么pgBackRest是正常运作。‘wal archive min/max’ 显示了当前存储在存档中的最小和最大的WAL文件。备份部分显示的是从保留最老的到保留最新的。最老的备份一定是全量备份(在label的结尾用F标记),最新的备份可以是全量备份,差异备份(结尾用D标记)或者增量备份(结尾用I标记)。‘timestamp start/stop’定义了备份运行的时间周期。’timestamp stop’可用于确定在执行点时恢复时使用的备份,确定在执行基于时间恢复需要使用哪些备份文件。更多关于及时恢复的信息可以在基于时间点恢复部分中找到。‘wal start/stop’定义了在恢复时使数据库保持一致所需的WAL范围。备份命令会确保在备份完成之前保留WAL的范围完整。‘database size’是数据库的未压缩的完整大小,而’backup size’是实际备份的数据量(对于全库备份也是一样的)。’repository size’包括备份中的所有文件和恢复数据库所需的任何引用备份,’repository backup size’只包括备份中的文件(对于完整备份,这些文件也是相同的)。如果在pgBackRest或文件系统中启用压缩,存储库大小会反映压缩文件大小。‘backup reference list’包含还原此备份所需的额外备份。

2.11 恢复备份

备份能够保护你免受许多灾难的困扰,其中最常见的是硬件故障和数据损坏。模拟数据损坏最简单的方法就是移除PostgreSQL实例的重要文件。db-master ⇒ 关闭演示数据库实例,删除pg_control文件。

$ sudo pg_ctlcluster 9.4 demo stop
$ sudo -u postgres rm var/lib/postgresql/9.4/demo/global/pg_control

缺少了pg_control文件的实例在启动时会报错:db-master ⇒ 尝试启动演示实例

$ sudo pg_ctlcluster 9.4 demo start
The PostgreSQL server failed to start. Please check the log output:
postgres: could not find the database system
Expected to find it in the directory "/var/lib/postgresql/9.4/demo",
but could not open file "/var/lib/postgresql/9.4/demo/global/pg_control": No such file or directory

恢复PostgreSQL实例需要使用pgBackRest运行restore命令。实例需要停止服务(事实上现在已经停止了)并且所有的文件都需要从数据库实例的数据目录中移除。db-master ⇒ 从演示实例中移除旧文件

$ sudo -u postgres find var/lib/postgresql/9.4/demo -mindepth 1 -delete

db-master ⇒ 恢复演示实例并启动

$ sudo -u postgres pgbackrest --stanza=demo restore
$ sudo pg_ctlcluster 9.4 demo start

本次还原丢失的pg_control文件后,数据库实例启动成功。

更多关于恢复的内容请参阅第五章恢复章节。

3、备份

本章节介绍备份命令的特点功能。

3.1    快速启动选项:

默认情况下,pgBackRest在启动备份之前将等待下一次定期计划的检查点。因此,由于PostgreSQL对于参数checkpoint_timeout和checkpoint_segments的设置,在检查点完成之前可能要花相当长的时间,才可以开始备份。db-master ⇒ 正常定期计划的检查点下的增量备份

$ sudo -u postgres pgbackrest --stanza=demo --type=incr --log-level-console=info backup
P00   INFO: backup command begin 1.23: --db1-path=/var/lib/postgresql/9.4/demo --log-level-console=info --log-level-stderr=off --no-log-timestamp --repo-path=/var/lib/pgbackrest --retention-full=2 --stanza=demo --type=incr
P00   INFO: last backup label = 20170903-213427F_20170903-213433D, version = 1.23
P00   INFO: execute exclusive pg_start_backup() with label "pgBackRest backup started at 2017-09-03 21:34:47": backup begins after the next regular checkpoint completes
P00   INFO: backup start archive = 000000020000000000000006, lsn = 0/6000028
P01   INFO: backup file var/lib/postgresql/9.4/demo/base/12139/pg_internal.init (115.2KB, 72%) checksum 0a8999bdda6c8b69a9eb2d34aac1c5e26eda47ea
       [filtered 13 lines of output]

当—start-fast在命令行中被指定或者在配置文件/etc/pgbackrest.conf中设置start-fast=y来请求立即执行检查点,备份会被快速启动。这对于测试和ad-hoc备份是非常有用的。例如,如果在检查点的发生窗口开始处进行备份,那么等待是没有意义的。通常情况下,定时备份全天只会进行一次所以启用/etc/pgbackrest.conf中的start-fast对性能产生的负面影响不会很大。但是对于高容量事务系统,您可能需要在命令行上指定—start-fast。另外,你可以通过在命令行指定-no-start-fast来重写配置文件中的配置。

db-master:/etc/pgbackrest.conf ⇒ 启用start-fast选项

[demo]
db-path=/var/lib/postgresql/9.4/demo
[global]
repo-path=/var/lib/pgbackrest
retention-full=2
start-fast=y

db-master ⇒ 对配置了immediate checkpoint演示数据库进行增量备份

$ sudo -u postgres pgbackrest --stanza=demo --type=incr --log-level-console=info backup
P00   INFO: backup command begin 1.23: --db1-path=/var/lib/postgresql/9.4/demo --log-level-console=info --log-level-stderr=off --no-log-timestamp --repo-path=/var/lib/pgbackrest --retention-full=2 --stanza=demo --start-fast --type=incr
P00   INFO: last backup label = 20170903-213427F_20170903-213447I, version = 1.23
P00   INFO: execute exclusive pg_start_backup() with label "pgBackRest backup started at 2017-09-03 21:34:51": backup begins after the requested immediate checkpoint completes
P00   INFO: backup start archive = 000000020000000000000007, lsn = 0/7000028
P01   INFO: backup file var/lib/postgresql/9.4/demo/global/pg_control (8KB, 97%) checksum 09f403fce1c542666a9ef8982b4fb7fdc09ad877
       [filtered 8 lines of output]

3.2    自动停止选项:

有时会出现这种情况,由于一些原因到导致pgBackRest异常退出,而在集群中正在进行的备份不会被正确停止。当发生错误时,pgBackRest会尽可能快的退出,以便能够获取准确的原因,并且不会被另一个可能引起更广泛清理的问题掩盖这有一个删除存储文件导致的错误。db-master ⇒ 在pgBackRest转储文件中移除用户写权限后尝试备份操作。

$ sudo chmod 550 /var/lib/pgbackrest/backup/demo/
$ sudo -u postgres pgbackrest --stanza=demo --type=incr --log-level-console=info backup
       [filtered 2 lines of output]
P00   INFO: execute exclusive pg_start_backup() with label "pgBackRest backup started at 2017-09-03 21:34:55": backup begins after the requested immediate checkpoint completes
P00   INFO: backup start archive = 000000020000000000000008, lsn = 0/8000028
P00  ERROR: [047]: unable to create path '/var/lib/pgbackrest/backup/demo/20170903-213427F_20170903-213455I': Permission denied
P00   INFO: backup command end: aborted with exception [047]

即使目录权限被加大了,但是由于数据库实例依然处于备份模式中,所以pgBackRest仍然无法执行备份操作。
db-master ⇒ 还原在转储文件的写入特权,并尝试备份。

sudo chmod 750 /var/lib/pgbackrest/backup/demo/
sudo -u postgres pgbackrest --stanza=demo --type=incr --log-level-console=info backup
P00   INFO: backup command begin 1.23: --db1-path=/var/lib/postgresql/9.4/demo --log-level-console=info --log-level-stderr=off --no-log-timestamp --repo-path=/var/lib/pgbackrest --retention-full=2 --stanza=demo --start-fast --type=incr
P00   INFO: last backup label = 20170903-213427F_20170903-213451I, version = 1.23
P00   INFO: execute exclusive pg_start_backup() with label "pgBackRest backup started at 2017-09-03 21:34:57": backup begins after the requested immediate checkpoint completes
P00  ERROR: [057]: ERROR:  a backup is already in progress
            HINT:  Run pg_stop_backup() and try again.:
            select to_char(current_timestamp, 'YYYY-MM-DD HH24:MI:SS.US TZ'), pg_xlogfile_name(lsn), lsn::text from pg_start_backup('pgBackRest backup started at 2017-09-03 21:34:57', true) as lsn

启用stop-auto选项,如果检测到没有其他pgBackRest备份进程正在运行,则pgBackRest停止当前备份。

db-master:/etc/pgbackrest.conf ⇒  启用stop-auto选项

[demo]
db-path=/var/lib/postgresql/9.4/demo
[global]
repo-path=/var/lib/pgbackrest
retention-full=2
start-fast=y
stop-auto=y

现在,pgBackRest将停止旧的备份,开始一个新的备份,进程会执行成功。
db-master ⇒ 执行增量备份

$ sudo -u postgres pgbackrest --stanza=demo --type=incr --log-level-console=info backup
P00   INFO: backup command begin 1.23: --db1-path=/var/lib/postgresql/9.4/demo --log-level-console=info --log-level-stderr=off --no-log-timestamp --repo-path=/var/lib/pgbackrest --retention-full=2 --stanza=demo --start-fast --stop-auto --type=incr
P00   INFO: last backup label = 20170903-213427F_20170903-213451I, version = 1.23
P00   WARN: the cluster is already in backup mode but no pgBackRest backup process is running. pg_stop_backup() will be called so a new backup can be started.
P00   INFO: execute exclusive pg_stop_backup() and wait for all WAL segments to archive
P00   INFO: execute exclusive pg_start_backup() with label "pgBackRest backup started at 2017-09-03 21:34:58": backup begins after the requested immediate checkpoint completes
P00   INFO: backup start archive = 000000020000000000000009, lsn = 0/9000028
P01   INFO: backup file /var/lib/postgresql/9.4/demo/global/pg_control (8KB, 97%) checksum 8d583e9f1010cbb549b2326985b1de0092caea99
       [filtered 8 lines of output]

尽管这个特性是有用的,但是当使用另一个第三方备份解决方案进行联机备份时,此功能可能不合适,因为pgBackRest不会识别其他软件正在运行,并且可能终止由该软件启动的备份。通常我们也不会去同时运行多个第三方备份工具,因此这应该也不是一个问题。
pg_dump 和pg_basebackup与pgBackRest一起运行是安全的,不会受到影响。

3.3 归档超时

在连接备份过程中,pgBackRest等待为使备份保持一致而需要存档的WAL段。这个默认时间受参数archive-timeout影响,默认为60s。如果已知每个段的归档时间超过这个时间,那么需要适当调大这个配置。

4、保留


通常,最好保留尽可能多的备份,以便为时间点恢复提供更大的窗口,但也必须考虑到诸如磁盘空间等实际问题。保留选项一旦不再需要,就移除旧备份。

4.1 全备份保留

通过配置retention-full参数来指定全量备份的保留数量。在移除老备份之前新备份必须备份完成,也就是说,如果你配置retention-full=2,那么在最老的备份过期之前,将存储三个完整备份。

db-master:/etc/pgbackrest.conf ⇒ 配置retention-full

[demo]
db-path=/var/lib/postgresql/9.4/demo
[global]
repo-path=/var/lib/pgbackrest
retention-full=2
start-fast=y
stop-auto=y

备份保留参数retention-full=2,但是当前这儿只有一个全备份,所以下一次执行数据库全备份时候,本次备份不会失效。
db-master ⇒ 执行数据库全库备份

$ sudo -u postgres pgbackrest --stanza=demo --type=full --log-level-console=detail backup
[filtered 766 lines of output]
P00   INFO: backup command end: completed successfully
P00   INFO: expire command begin 1.23: --log-level-console=detail --log-level-stderr=off --no-log-timestamp --repo-path=/var/lib/pgbackrest --retention-archive=2 --retention-full=2 --stanza=demo
P00 DETAIL: archive retention on backup 20170903-213427F, archiveId = 9.4-1, start = 000000010000000000000002
P00 DETAIL: no archive to remove, archiveId = 9.4-1
P00   INFO: expire command end: completed successfully

归档文件会过期,因为在最老的备份之前有WAL生成。这些对恢复是没有用处的——只有在备份之后生成的WAL文件可以用于恢复。
db-master ⇒ 执行数据库全库备份

$ sudo -u postgres pgbackrest --stanza=demo --type=full --log-level-console=info backup
       [filtered 766 lines of output]
P00   INFO: backup command end: completed successfully
P00   INFO: expire command begin 1.23: --log-level-console=info --log-level-stderr=off --no-log-timestamp --repo-path=/var/lib/pgbackrest --retention-archive=2 --retention-full=2 --stanza=demo
P00   INFO: expire full backup set: 20170903-213427F, 20170903-213427F_20170903-213433D, 20170903-213427F_20170903-213447I, 20170903-213427F_20170903-213451I, 20170903-213427F_20170903-213458I
P00   INFO: remove expired backup 20170903-213427F_20170903-213458I
P00   INFO: remove expired backup 20170903-213427F_20170903-213451I
       [filtered 3 lines of output]

20170903-213427F的全库备份已过期,归档保留是基于当前最老的全库备份20170903-213504F。

4.2 差异备份保留

设置的retention-diff的参数配置和保留的差异备份的数量不同。差异备份只依赖于之前的全库备份因此它可能在最后一天或更多时间创建滚动的差异集。这可以快速恢复到当前的时间点,但是减少总体空间消耗。
b-master:/etc/pgbackrest.conf ⇒ 配置retention-diff

[demo]
db-path=/var/lib/postgresql/9.4/demo
[global]
repo-path=/var/lib/pgbackrest
retention-diff=1
retention-full=2
start-fast=y
stop-auto=y

备份参数设置retention-diff=1,因此在一个备份过期之前会保留两个备份,增量备份创建意味着另一个增量备份的过期,增量备份不会自己单独过期,他往往伴随着与之相关的全量备份和增量备份共同过期。

db-master ⇒ 执行差异和增量备份

$ sudo -u postgres pgbackrest --stanza=demo --type=diff backup
$ sudo -u postgres pgbackrest --stanza=demo --type=incr backup

现在执行一个差异备份,使之前的差异备份和增量备份失效,只保留一个差异备份。

db-master ⇒ 执行差异备份

$ sudo -u postgres pgbackrest --stanza=demo --type=diff --log-level-console=info backup
      [filtered 10 lines of output]
P00   INFO: backup command end: completed successfully
P00   INFO: expire command begin 1.23: --log-level-console=info --log-level-stderr=off --no-log-timestamp --repo-path=/var/lib/pgbackrest --retention-archive=2 --retention-diff=1 --retention-full=2 --stanza=demo
P00   INFO: expire diff backup set: 20170903-213510F_20170903-213517D, 20170903-213510F_20170903-213521I
P00   INFO: remove expired backup 20170903-213510F_20170903-213521I
P00   INFO: remove expired backup 20170903-213510F_20170903-213517D

4.3 保留归档

尽管在备份过期的时候会移除WAL文件的归档(使用retention-full的选项默认情况是会使WAL过期的),但是为了节省磁盘空间,主动处理时效的归档文件是十分有效的。为了进行差异归档保留,完整备份会被视为差异备份。
对归档进行过期操作永远不会移除哪些备份恢复还需要的WAL段。因为基于时间点恢复(PITR)的操作只能进行在持续的WAL流中,所有除去正常的是归档过期外,主动执行过期操作是需要格外谨慎。
db-master:/etc/pgbackrest.conf ⇒ 配置retention-diff

[demo]
db-path=/var/lib/postgresql/9.4/demo
[global]
repo-path=/var/lib/pgbackrest
retention-diff=2
retention-full=2
start-fast=y
stop-auto=y

db-master ⇒ 执行差异备份

$ sudo -u postgres pgbackrest --stanza=demo --type=diff --log-level-console=info backup
       [filtered 7 lines of output]
P00   INFO: execute exclusive pg_stop_backup() and wait for all WAL segments to archive
P00   INFO: backup stop archive = 000000020000000000000012, lsn = 0/120000F0
P00   INFO: new backup label = 20170903-213510F_20170903-213530D
P00   INFO: backup command end: completed successfully
P00   INFO: expire command begin 1.23: --log-level-console=info --log-level-stderr=off --no-log-timestamp --repo-path=/var/lib/pgbackrest --retention-archive=2 --retention-diff=2 --retention-full=2 --stanza=demo

db-master ⇒ 使归档过期

$ sudo -u postgres pgbackrest --stanza=demo --log-level-console=detail --retention-archive-type=diff --retention-archive=1 expire
P00   INFO: expire command begin 1.23: --log-level-console=detail --log-level-stderr=off --no-log-timestamp --repo-path=/var/lib/pgbackrest --retention-archive=1 --retention-archive-type=diff --retention-diff=2 --retention-full=2 --stanza=demo
P00 DETAIL: archive retention on backup 20170903-213504F, archiveId = 9.4-1, start = 00000002000000000000000A, stop = 00000002000000000000000A
P00 DETAIL: archive retention on backup 20170903-213510F, archiveId = 9.4-1, start = 00000002000000000000000B, stop = 00000002000000000000000B
P00 DETAIL: archive retention on backup 20170903-213510F_20170903-213525D, archiveId = 9.4-1, start = 00000002000000000000000E, stop = 00000002000000000000000E
P00 DETAIL: archive retention on backup 20170903-213510F_20170903-213530D, archiveId = 9.4-1, start = 000000020000000000000012
P00 DETAIL: remove archive: archiveId = 9.4-1, start = 00000002000000000000000C, stop = 00000002000000000000000D
P00 DETAIL: remove archive: archiveId = 9.4-1, start = 00000002000000000000000F, stop = 000000020000000000000011
P00   INFO: expire command end: completed successfully

在20170903-213510F_20170903-213525D的差异备份中已经归档了必须保留的WAL段以便与更老的备份保持一致,即使他们不能在基于时间点进行恢复。在20170903-213510F_20170903-213525D之后并且在20170903-213510F_20170903-213530D之前的WAL文件被移除。在新的备份20170903-213510F_20170903-213530D之后的WAL段仍然保留,并且可以用于PITR恢复。
由于全量备份被认为是保留差异归档目的的差异备份,如果在现在使用相同的配置执行一个全库备份,则只有在全库备份之后的WAL可被用于PITR恢复。





扫码关注了解更多









文章转载自飞象数据,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论