前言:

之前的备份是每日凌晨做全备,没有增量备份的策略。 这样导致每天备份时间越来越长以及磁盘占有率越来越高的问题越来越明显。
之前全备采用的工具是 PG 原生自带的命令 pgdump, 这个命令是不支持增量的, 而业界PG的备份工具又是鱼龙混杂的,种类繁多。

我们对比了pgbackrest,barman, pg_rman,bart… 等等, 测试了我们必要的功能点像是: 加密, 压缩,parallel, standby 节点支持备份,远程备份,以及PITR

那么,pgbackreset是一个比较理想的灾备工具,关键的功能是PITR和wal日志文件自动管理以及增量备份和差异化备份,其次是pgbackrest的备份效率从近一段时间的使用来看是比pg_dump 这样的逻辑备份更快的,因为它是物理备份方式,备份和还原都是基于wal日志文件来进行的

这里其实是有一个非常重要的概念,那就是wal日志文件,基于wal日志文件我们才可以做到按秒级灾备恢复,不像pg_dump ,它的备份恢复仅仅是一个大致的时间,pg_dump 备份期间以及备份完成后到下一次备份的时间段内的数据库改变是无法做到记录保存,自然的,恢复也就是仅仅一个大致时间段了

🆗,那么pgbackrest的wal日志文件管理又是什么原理呢?这个就比较简单了,wal日志文件归档之时就是postgresql.conf 文件内定义的归档命令执行的时候,自然的,pg_wal 这个wal日志文件存放的地方将不会有太多的wal日志文件了,通俗的说,pgbackrest将会有效的防止wal日志膨胀,只需要关心pgbackrest的仓库磁盘空间够不够wal日志文件的存放了,如何存放,如何使用也就是如何恢复,这些事情交给pgbackrest就好了,你只需要告诉pgbackrest你希望恢复到哪个时间段或者哪个事务id等等诸如此类需求就可以了

下面有一些概念,需要提前说一说,一个是wal日志由于是一个稀疏格式的data类型文件,因此,该文件可压缩的比率是非常高的,虽然它创建出来的时候默认就是占用16M磁盘空间,但如果采用合理的压缩方式比如lz4命令压缩,将会非常小,而pgbackrest是可以间接调用压缩命令的,比如bzip2,gzip,lz4,zstd等等这些命令,因此,整体来说,pgbackrest备份占用的空间基本和pg_dump 逻辑备份基本一致,这也就是意味着pgbackrest可以备份的数据量级是可以很高的,虽然压缩会占用cpu资源,但这些是完全值得的

其次,pgbackrest可以管理,也就是灾备恢复多个数据库实例,因此,集群的整体备份和管理也就方便了很多,比如,有多个pg库,那么,可以存放到统一的一个专用的服务器上进行灾备

最后,需要提醒的,也是一个需要注意的问题是,pgbackrest不像pg_dump的逻辑备份恢复,是需要停机恢复的,停机时间视恢复速度而定,如果对冷恢复有介意,即使半个小时,十几分钟这样的停机时间也介意的话,那么,pgbackrest不是你的首要选择,当然,也并不是彻底没有办法,可以高可用+主备切换等等技术手段规避冷恢复造成停机进而影响业务这种问题,不过这些不在本文的讨论范围内

源码包下载地址:Github 链接: https://github.com/pgbackrest/pgbackrest

yum install bzip2 bzip2-devel zlib zlib-devel readline readline-devel perl perl-devel gcc gcc-c++ postgresql-libs postgresql-devel libyaml-devel libyaml libxml2-devel libxml2 -y

pgbackrest的安装部署

部署方式有两种,第一种是yum安装方式,需要配置postgresql官方的源,命令为yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm;第二种是源码编译方式,目前来说,没有找到过现成的二进制pgbackrest文件

yum安装方式就没什么好说的了,配置好PGDG官方yum源就可以了,下面主要说明一下编译安装

编译安装pgbackrest主要是需要安装依赖libyamllibyaml-devel 这些依赖已经制作成了离线yum,上传到服务器上后,解压挂载为仓库就可以使用了

安装命令为:

yum  install libyaml libyaml-devel -y

编译的依赖安装完毕后,将附件2,也就是pgbackrest的源码包上传到服务器上后,解压,进入解压目录,然后编译三连,命令如下:

./configure && make && make install

make install 命令将会自动把pgbackrest命令加入系统环境变量

测试pgbackrest是否安装正常:

[root@EULEER ~]# pgbackrest version
pgBackRest 2.49


以上命令正确输出pgbackrest的版本号表示pgbackrest安装成功

pgbackrest的配置说明

其实pgbackrest的安装部署是十分简单的,关键难点在于配置,而pgbackrest不管是什么方式安装的,基本都是没有什么配置模板的,其次是命令行里可以写配置参数,配置文件里也可以写配置参数,但优先级并不清楚,总的来说,该软件是和其它软件不太一样,显得很怪异。

pgbackrest备份可以分为两种情况,第一种情况是远程备份,也就是备份文件存放在远程服务器上,pgbackrest通过ssh或者s3对象存储拉取数据库的wal日志文件以及数据库的其它文件,恢复的时候是在数据库端操作,第二种情况是本地备份,也就是备份数据文件存放在数据库端,恢复的时候还是在数据库端操作

下面将以VMware虚拟机来说明如何执行远程备份/本地备份和恢复操作

VMware虚拟机有两台,第一台服务器的IP地址是192.168.76.11,计划在该服务器上做远程备份,该服务器只安装了pgbackrest,没有安装任何其它的软件,此服务器后面就称呼为远程备份端

第二台服务器的IP地址是192.168.76.22,计划在该服务器上部署postgresql,也需要安装pgbackrest,其它软件不需要安装,此服务器后面就称呼为数据库端

需要特别注意的是,远程备份和本地备份不能同时存在,要么就远程备份---本地恢复这样的模式,要么就本地备份---本地恢复这样的模式,两种模式不能混杂,主要原因是数据库通常就一个实例,它的archive-command是指定了stanza名称的

  • 远程备份+本地恢复模式

192.168.76.11远程服务器上的pgbackrest的配置文件

[root@EULEER ~]# pgbackrest version
pgBackRest 2.49
[root@EULEER ~]# cat /etc/pgbackrest.conf 
[global]
# 这是全局配置部分,对所有 stanza 都有效

# 保留备份的历史记录数(仅全量,没有测试是否正确)
repo1-retention-full=7

#备份数据文件存储路径
repo-path=/var/lib/pgsql/pgbackreset_bakdir
# 如果数据库在备份过程中改变大小,则自动调整保留策略
#repo1-retention-full-type=count

# 使用压缩节省存储空间,也就是cpmpress-level,最高9,process是线程数,4个线程并行备份,不建议太高
process-max=4
compress-level=6

# 指定日志文件的位置和名称
log-path=/var/log/pgbackrest
log-level-file=detail
#下面这个是日志等级,可以在配置文件里定义,命令行里可以重新定义,常用info,debug,如果是调试的时候
log-level-console=info

# 如果需要加密备份,可以在这里设置加密密钥路径,这个我至今没有搞明白怎么用的
# cipher-type=aes-256-cbc
# cipher-pass=[your_encryption_password]
#下面这个是stanza的名称,这里是test这个名字
[test]
# 这是一个特定的 stanza,对应于一个特定的数据库实例

# 指定要备份的 PostgreSQL 数据库的数据目录,以数据库的实际数据路径为准
pg1-path=/usr/local/pgsql/data
#这个也是实际为准,如果postgresql.conf里有配置socker的路径,默认是tmp,远程连接数据库用的
pg1-socket-path=/tmp/

# 可选:指定备用存储库路径
# repo-path-secondary=/mnt/secondary-backup

# 如果数据库运行在非默认端口或使用了 Unix 套接字连接,可以在此处指定
pg1-port=5432
pg1-host=192.168.76.22

# 设置用于执行备份操作的 Postgres 用户,该用户指的是数据库的用户
pg1-host-user=postgres

# 设置 archive_command 和 restore_command,确保归档日志被正确处理
archive-async=y
archive-push-queue-max=100GB
archive-get-queue-max=100GB

192.168.76.22数据库端的pgbackrest的配置文件:

该文件的主要作用是执行恢复操作的时候,从远程备份节点拉取wal日志文件以及恢复需要的其它文件,因此,它指定的是repo1-host=192.168.76.11

[postgres@centos2 data]$ cat /etc/pgbackrest.conf
[global]
# 这是全局配置部分,对所有 stanza 都有效
repo1-host=192.168.76.11
# 这个用户指的是远程备份服务器的系统用户,是可以通过id 命令查询到的,如果没有,则创建这个用户,并赋予密码
repo1-host-user=postgres

repo-path=/var/lib/pgsql/pgbackreset_bakdir
# 如果数据库在备份过程中改变大小,则自动调整保留策略
#repo1-retention-full-type=count

# 使用压缩节省存储空间
process-max=4
compress-level=6

# 指定日志文件的位置和名称
log-path=/var/log/pgbackrest
log-level-file=detail
log-level-console=info

# 如果需要加密备份,可以在这里设置加密密钥路径
# cipher-type=aes-256-cbc
# cipher-pass=[your_encryption_password]

[test]
# 这是一个特定的 stanza,对应于一个特定的数据库实例,和上面的配置文件要对应

# 指定要备份的 PostgreSQL 数据库的数据目录
pg1-path=/usr/local/pgsql/data
pg1-socket-path=/tmp/
# 备份存储备份的地方

# 可选:指定备用存储库路径
# repo-path-secondary=/mnt/secondary-backup

# 如果数据库运行在非默认端口或使用了 Unix 套接字连接,可以在此处指定
pg1-port=5432
#pg1-host=192.168.76.11
#pg1-user=postgres
#pg1-password=shiguang32
#pg1-socket-path=/tmp/.s.PGSQL.5432

# 设置用于执行备份操作的 Postgres 用户
pg1-host-user=postgres

# 设置 archive_command 和 restore_command,确保归档日志被正确处理
archive-async=y
archive-push-queue-max=100GB
archive-get-queue-max=100GB

数据库的主配置文件postgresql.conf 的wal日志文件归档命令:

archive_command = 'pgbackrest  --stanza=test  archive-push %p'

数据库的主配置文件修改完毕后,重启数据库以使之生效,并配置两个服务器之间的免密(免密操作基础知识,就不在这里废话了,主要是两个服务器的普通用户postgres这个用户之间的免密),经过stanza-create,check后,就可以在远程服务器端执行备份操作并在备份完成后在数据库端执行恢复操作了(初始化顺序不能错,必须是先远程仓库端,然后在数据库端)

  1. 初始化远程端的stanza

该步骤的作用是在远程备份服务器端生成备份需要的相关文件和目录

必须在远端服务器执行,命令以及日志如下(可以反复执行stanza-create,但数据库必须是启动状态):

-bash-4.2$ pgbackrest --stanza=test --config=/etc/pgbackrest.conf stanza-create
2024-03-15 13:32:34.514 P00   INFO: stanza-create command begin 2.49: --config=/etc/pgbackrest.conf --exec-id=3006-738529c8 --log-level-console=info --log-level-file=detail --log-path=/var/log/pgbackrest --pg1-host=192.168.76.22 --pg1-host-user=postgres --pg1-path=/usr/local/pgsql/data --pg1-port=5432 --pg1-socket-path=/tmp/ --repo1-path=/var/lib/pgsql/pgbackreset_bakdir --stanza=test
2024-03-15 13:32:35.421 P00   INFO: stanza-create for stanza 'test' on repo1
2024-03-15 13:32:35.425 P00   INFO: stanza 'test' already exists on repo1 and is valid
2024-03-15 13:32:35.526 P00   INFO: stanza-create command end: completed successfully (1014ms)
  1. check备份系统

check的作用是检查数据库的wal日志文件是否可以正确归档(可以反复执行check,每一次检查会归档一次wal日志文件到远端服务器的仓库内)

-bash-4.2$ pgbackrest --stanza=test --config=/etc/pgbackrest.conf check
2024-03-15 13:40:57.746 P00   INFO: check command begin 2.49: --config=/etc/pgbackrest.conf --exec-id=17125-cb3a358d --log-level-console=info --log-level-file=detail --log-path=/var/log/pgbackrest --pg1-host=192.168.76.22 --pg1-host-user=postgres --pg1-path=/usr/local/pgsql/data --pg1-port=5432 --pg1-socket-path=/tmp/ --repo1-path=/var/lib/pgsql/pgbackreset_bakdir --stanza=test
2024-03-15 13:40:58.648 P00   INFO: check repo1 configuration (primary)
2024-03-15 13:40:59.063 P00   INFO: check repo1 archive for WAL (primary)
2024-03-15 13:41:00.171 P00   INFO: WAL segment 00000003000000000000006C successfully archived to '/var/lib/pgsql/pgbackreset_bakdir/archive/test/12-1/0000000300000000/00000003000000000000006C-1706481e776476f4ccb6947197af38a34f26343d.gz' on repo1
2024-03-15 13:41:00.287 P00   INFO: check command end: completed successfully (2543ms)

check命令执行了三次,看仓库文件,可以看到有三个wal日志文件的压缩包:

-bash-4.2$ ls -alh /var/lib/pgsql/pgbackreset_bakdir/archive/test/12-1/0000000300000000/
total 68K
drwxr-x--- 2 postgres postgres 4.0K Mar 15 13:44 .
drwxr-x--- 3 postgres postgres 4.0K Mar 15 13:40 ..
-rw-r----- 1 postgres postgres  17K Mar 15 13:40 00000003000000000000006C-1706481e776476f4ccb6947197af38a34f26343d.gz
-rw-r----- 1 postgres postgres  17K Mar 15 13:43 00000003000000000000006D-b40c268538075cee15edd8acf6a64e0f958eaf99.gz
-rw-r----- 1 postgres postgres  17K Mar 15 13:44 00000003000000000000006E-1b219e4add064a9bb1e5dbfd9bd7bf3cb487ecf6.gz
  1. 备份参数说明

完整备份:pgBackRest将数据库的全部内容复制到备份中。数据库的第一次备份始终是完整备份。pgBackRest能够直接恢复完整备份。完整备份不依赖于完整备份之外的任何备份。

差异备份:PGbackrest只复制自上次全量备份以后更改的数据库文件。PGbackrest通过复制的差异备份中的所有文件和上一次全量备份中未更改文件进行对比来恢复差异备份。差异备份的优点是它需要的磁盘空间比完全备份少,但是,差异备份和完全备份必须都有效才能还原差异备份。

增量备份: PGbackrest只复制自上次备份(可以是另一个增量备份、差异备份或完全备份)以来已更改的数据库群集文件。由于增量备份仅包括自上次备份以来更改的文件,因此它们通常比完整备份或差异备份小得多。与差异备份一样,增量备份取决于其他备份是否有效来进行恢复增量备份。由于增量备份仅包括自上次备份以来的文件,因此,所有先前备份,包括上一次的增量备份、上一次得差异备份和上一次的完全备份都必须有效,才能执行增量备份的还原。如果不存在差异备份,则所有以前的增量备份都将返回到以前的完整备份(必须存在),并且完整备份本身必须有效才能还原增量备份。

  1. 第一次备份

即使指定了模式也仍然是全备:

-bash-4.2$ pgbackrest --stanza=test --config=/etc/pgbackrest.conf backup
2024-03-15 13:48:52.834 P00   INFO: backup command begin 2.49: --compress-level=6 --config=/etc/pgbackrest.conf --exec-id=30380-70d581b1 --log-level-console=info --log-level-file=detail --log-path=/var/log/pgbackrest --pg1-host=192.168.76.22 --pg1-host-user=postgres --pg1-path=/usr/locaal/pgsql/data --pg1-port=5432 --pg1-socket-path=/tmp/ --process-max=4 --repo1-path=/var/lib/pgsql/pgbackreset_bakdir --repo1-retention-full=7 --stanza=test
WARN: no prior backup exists, incr backup has been changed to full
2024-03-15 13:48:53.824 P00   INFO: execute non-exclusive backup start: backup begins after the next regular checkpoint completes
2024-03-15 13:48:54.573 P00   INFO: backup start archive = 000000030000000000000070, lsn = 0/70000060
2024-03-15 13:48:54.573 P00   INFO: check archive for prior segment 00000003000000000000006F
2024-03-15 13:49:50.420 P00   INFO: execute non-exclusive backup stop and wait for all WAL segments to archive
2024-03-15 13:49:50.830 P00   INFO: backup stop archive = 000000030000000000000070, lsn = 0/70000170
2024-03-15 13:49:50.851 P00   INFO: check archive for segment(s) 000000030000000000000070:000000030000000000000070
2024-03-15 13:49:52.113 P00   INFO: new backup label = 20240328-124054F
2024-03-15 13:49:52.315 P00   INFO: full backup size = 765.3MB, file total = 1049
2024-03-15 13:49:52.316 P00   INFO: backup command end: completed successfully (59485ms)
2024-03-15 13:49:52.316 P00   INFO: expire command begin 2.49: --config=/etc/pgbackrest.conf --exec-id=30380-70d581b1 --log-level-console=info --log-level-file=detail --log-path=/var/log/pgbackrest --repo1-path=/var/lib/pgsql/pgbackreset_bakdir --repo1-retention-full=7 --stanza=test
2024-03-15 13:49:52.331 P00   INFO: expire command end: completed successfully (15ms)
  1. 第二次备份

指定为增量备份(这里需要注意,pgbackrest在备份成功后,会执行一次过期文件清理,过期的wal日志文件清理后,才算完成一个完整的备份周期):

-bash-4.2$ pgbackrest --stanza=test --config=/etc/pgbackrest.conf --type=incr backup
2024-03-15 13:51:41.583 P00   INFO: backup command begin 2.49: --compress-level=6 --config=/etc/pgbackrest.conf --exec-id=2652-34256329 --log-level-console=info --log-level-file=detail --log-path=/var/log/pgbackrest --pg1-host=192.168.76.22 --pg1-host-user=postgres --pg1-path=/usr/local/pgsql/data --pg1-port=5432 --pg1-socket-path=/tmp/ --process-max=4 --repo1-path=/var/lib/pgsql/pgbackreset_bakdir --repo1-retention-full=7 --stanza=test --type=incr
2024-03-15 13:51:42.661 P00   INFO: last backup label = 20240328-124054F, version = 2.49
2024-03-15 13:51:42.661 P00   INFO: execute non-exclusive backup start: backup begins after the next regular checkpoint completes
2024-03-15 13:51:43.403 P00   INFO: backup start archive = 000000030000000000000072, lsn = 0/72000028
2024-03-15 13:51:43.403 P00   INFO: check archive for prior segment 000000030000000000000071
2024-03-15 13:51:46.883 P00   INFO: execute non-exclusive backup stop and wait for all WAL segments to archive
2024-03-15 13:51:47.297 P00   INFO: backup stop archive = 000000030000000000000072, lsn = 0/72000100
2024-03-15 13:51:47.320 P00   INFO: check archive for segment(s) 000000030000000000000072:000000030000000000000072
2024-03-15 13:51:48.597 P00   INFO: new backup label = 20240328-124054F_20240328-124343I
2024-03-15 13:51:48.738 P00   INFO: incr backup size = 13.5KB, file total = 1049
2024-03-15 13:51:48.739 P00   INFO: backup command end: completed successfully (7158ms)
2024-03-15 13:51:48.739 P00   INFO: expire command begin 2.49: --config=/etc/pgbackrest.conf --exec-id=2652-34256329 --log-level-console=info --log-level-file=detail --log-path=/var/log/pgbackrest --repo1-path=/var/lib/pgsql/pgbackreset_bakdir --repo1-retention-full=7 --stanza=test
2024-03-15 13:51:48.754 P00   INFO: expire command end: completed successfully (15ms)

经过若干次备份后,仓库内有很多wal日志文件压缩包了,可以看看备份了些什么文件(还是在远端执行,不需要在数据库执行):

-bash-4.2$ ls -alh /var/lib/pgsql/pgbackreset_bakdir/archive/test/12-1/0000000300000000/
total 176K
drwxr-x--- 2 postgres postgres 4.0K Mar 15 13:56 .
drwxr-x--- 3 postgres postgres 4.0K Mar 15 13:40 ..
-rw-r----- 1 postgres postgres  17K Mar 15 13:40 00000003000000000000006C-1706481e776476f4ccb6947197af38a34f26343d.gz
-rw-r----- 1 postgres postgres  17K Mar 15 13:43 00000003000000000000006D-b40c268538075cee15edd8acf6a64e0f958eaf99.gz
-rw-r----- 1 postgres postgres  17K Mar 15 13:44 00000003000000000000006E-1b219e4add064a9bb1e5dbfd9bd7bf3cb487ecf6.gz
-rw-r----- 1 postgres postgres  17K Mar 15 13:48 00000003000000000000006F-8dfa4533578c305f139d29d64b27e0e9d4312cc1.gz
-rw-r----- 1 postgres postgres  373 Mar 15 13:49 000000030000000000000070.00000060.backup
-rw-r----- 1 postgres postgres  17K Mar 15 13:49 000000030000000000000070-fbaa0b12492269cf62ba75510b2545247d1dc4b3.gz
-rw-r----- 1 postgres postgres  17K Mar 15 13:51 000000030000000000000071-aba565b6f59ea25a3f21f8bab36deea2d3850d66.gz
-rw-r----- 1 postgres postgres  373 Mar 15 13:51 000000030000000000000072.00000028.backup
-rw-r----- 1 postgres postgres  17K Mar 15 13:51 000000030000000000000072-3a53a424e1dc5eee281799daec1c4a8caeea7f4d.gz
-rw-r----- 1 postgres postgres  17K Mar 15 13:56 000000030000000000000073-2cd3f551a9e705a36499d70c5205ed2025452cbc.gz

备份工作需要在远端服务器执行,恢复工作需要在数据库本地端进行

例如,在非数据库服务器执行恢复将会报错,提示必须在运行postgresql的实例上进行,这是为了数据库的安全:

2024-03-15 12:16:21.397 P00   INFO: restore command begin 2.49: --config=/etc/pgbackrest.conf --delta --exec-id=8255-96568237 --log-level-console=info --log-level-file=detail --log-path=/var/log/pgbackrest --pg1-host=192.168.76.22 --pg1-path=/usr/local/pgsql/data --process-max=4 --repo1-path=/var/lib/pgsql/pgbackreset_bakdir --stanza=test --target="2024-03-26 11:51:54+08" --type=time
ERROR: [072]: restore command must be run on the PostgreSQL host
2024-03-15 12:16:21.397 P00   INFO: restore command end: aborted with exception [072]

在数据库运行的时候恢复也会报错,因此,必须要先停止数据库:

ERROR: [038]: unable to restore while PostgreSQL is running
       HINT: presence of 'postmaster.pid' in '/usr/local/pgsql/data' indicates PostgreSQL is running.
       HINT: remove 'postmaster.pid' only if PostgreSQL is not running.
2024-03-28 11:14:36.593 P00   INFO: restore command end: aborted with exception [038

小结一下,此种模式需要远端服务器和数据库本地服务器都安装pgbackrest,并且都写有配置文件,初始化pgbackrest只在远端服务器执行,也就是stanza-createcheck和备份也都是在远端服务器执行,而恢复必须在运行有postgresql实例的数据库端操作,数据库必须是关闭的

下面是数据库的恢复操作介绍

  1. 恢复操作

恢复--按时间恢复,先查看备份情况(此命令会将所有备份信息打印,在远程仓库端执行)

-bash-4.2$ pgbackrest --stanza=test --config=/etc/pgbackrest.conf info
stanza: test
    status: ok
    cipher: none

    db (current)
        wal archive min/max (12): 00000003000000000000006C/000000030000000000000074

        full backup: 20240328-124054F
            timestamp start/stop: 2024-03-28 12:40:54+08 / 2024-03-28 12:41:51+08
            wal start/stop: 000000030000000000000070 / 000000030000000000000070
            database size: 765.3MB, database backup size: 765.3MB
            repo1: backup set size: 151MB, backup size: 151MB

        incr backup: 20240328-124054F_20240328-124343I
            timestamp start/stop: 2024-03-28 12:43:43+08 / 2024-03-28 12:43:48+08
            wal start/stop: 000000030000000000000072 / 000000030000000000000072
            database size: 765.3MB, database backup size: 13.5KB
            repo1: backup set size: 151MB, backup size: 1.3KB
            backup reference list: 20240328-124054F

根据备份信息,选择一个时间段(2024-03-28 12:41:51+08

---2024-03-28 12:43:48+08),恢复范围是第一个全备完成时间到最后一个备份完成时间

[postgres@centos2 data]$ pgbackrest --config=/etc/pgbackrest.conf --delta --exec-id=8255-96568237 --log-level-console=info --log-level-file=detail --log-path=/var/log/pgbackret  --stanza=test --target="2024-03-28 12:43:51+08" --type=time restore
WARN: unable to open log file '/var/log/pgbackret/test-restore.log': No such file or directory
      NOTE: process will continue without log file.
2024-03-28 13:22:21.778 P00   INFO: restore command begin 2.49: --config=/etc/pgbackrest.conf --delta --exec-id=8255-96568237 --log-level-console=info --log-level-file=off --log-path=/var/log/pgbackret --pg1-path=/usr/local/pgsql/data --process-max=4 --repo1-host=192.168.76.11 --repo1-host-user=postgres --repo1-path=/var/lib/pgsql/pgbackreset_bakdir --stanza=test --target="2024-03-28 12:43:51+08" --type=time
2024-03-28 13:22:22.290 P00   INFO: repo1: restore backup set 20240328-124054F_20240328-124343I, recovery will start at 2024-03-28 12:43:43
2024-03-28 13:22:22.293 P00   INFO: remove invalid files/links/paths from '/usr/local/pgsql/data'
2024-03-28 13:22:25.970 P00   INFO: write updated /usr/local/pgsql/data/postgresql.auto.conf
2024-03-28 13:22:25.984 P00   INFO: restore global/pg_control (performed last to ensure aborted restores cannot be started)
2024-03-28 13:22:25.986 P00   INFO: restore size = 765.3MB, file total = 1049
2024-03-28 13:22:25.987 P00   INFO: restore command end: completed successfully (4212ms)
[postgres@centos2 data]$ pg_ctl -D /usr/local/pgsql/data -l logfile start
waiting for server to start...... done
server started

恢复完成后,通常不需要做任何改动,直接启动数据库就可以立刻使用了,在测试中遇到过数据库进入只读状态,但具体原因不清楚

  • 本地备份+本地恢复模式

本地备份指的是备份文件存放在本地服务器上,数据库的恢复操作也仅仅在本地执行

本地备份和恢复比较简单,主要是配置文件内的数据库相关配置项不能有pg-host或者pg1-host等等类似字段,否则pgbackrest会认为这个一个远程连接

配置文件如下:

[global]
repo1-path=/data/pgsql/backup
repo1-retention-full=2
repo1-host-user=postgres
repo1-retention-full-type=count
compress-type=lz4
log-level-file=detail
log-path=/var/log/pgbackrest
log-level-console=debug

[main]
pg1-path=/data/pgsql/data
pg1-user=postgres
pg1-port=15433
pg1-socket-path=/tmp
[global:archive-push]
compress-level=3
process-max=4

在数据库服务器内需要根据以上配置文件创建相关目录,并赋予用户权限,为了方便,使用postgres用户,防止备份失败的情况

mkdir -p /data/pgsql/backup 
mkdir -p /var/log/pgbackrest 
chown -Rf postgres. /var/log/pgbackrest 
chown -Rf postgres. /data/pgsql/backup

剩下的和远程备份方式一样,postgresql.conf 这个数据库主配置文件内添加archive-cmd命令,并执行

pgbackrest --stanza=main --config=/etc/pgbackrest.conf stanza-create
最后就是
pgbackrest --stanza=main --config=/etc/pgbackrest.conf check
pgbackrest --stanza=main --config=/etc/pgbackrest.conf --type=full backup
pgbackrest --stanza=main --config=/etc/pgbackrest.conf --type=incr backup