
前言:
先帖一个以前朋友画的对比图(此处纯系搬砖,如因此有盗图方面的冒犯,还请原谅。)

图有点老。也基本可以看出pg_probackup与pgbackrest功能都很强大。
还有下边的一些总结性的原话:
pg_dump/pg_dumpall + psql/pg restore和copy逻辑备份
pg_ basebackup物理备份
第三方备份工具
pg_probackup: 支持并行、一致性校验和备份压缩登,不过pg_probackup有一个严重的bug,其寻址范围最大只支持4GB,也就意味着不管你什么文件备份下来最大只有4GB,假如修改了segmentsize 并且大于4GB,也就意味着备份是不完整的,数据不可靠。(笔者记,此处似乎应该是2GB,32位带符号寻址。)
pg backrest: 支持S3和Azure兼容对象存储、一致性校验
pg barman: 可提供可靠的监控信息、备份加密
pg rman: 不支持流复制协议,意味着只能和数据节点跑在一起。
因为本文是针对pg_probackup进行描述的,最新消息,显示上边的4GB限制似乎有人在去年提出了fix,只是没有merge。当然这里也需要更正一下哈,上边的4GB应该是2GB,主要源于32位有符号整数的原因。
至于这个"fix"以及相对应的有人报告的"issue",分别见:
https://github.com/postgrespro/pg_probackup/issues/609 (issue)
https://github.com/postgrespro/pg_probackup/pull/510 (fix)
前者甚至还引用了后者。
使用与分析
2.1 编译安装
先下载14.8源码,解压至: iihero/source/postgresql-14.8
-- 获取https://github.com/postgrespro/pg_probackup, 直接放至postgresql-14.8/contrib目录下
cd /iihero/source/postgresql-14.8
./configure --with-openssl --prefix=/usr/pgsql-14-build2
make world-bin
su -c "make install-world-bin"
cd contrib/pg_probackup
make
su -c "make install"
即可完成安装。上边编译的是正常的: --with-segsize=1 (默认值)
我们只是想简单的试下用法。(具体的详细用法可以看看文档:https://www.modb.pro/db/382367)
[13:37:46-postgres@sean-rh1:/var/lib/pgsql]$ sudo mkdir -p /iihero/pg_probackup
[13:38:58-postgres@sean-rh1:/var/lib/pgsql]$ chown -R postgres:postgres /iihero/pg_probackup
[13:37:22-postgres@sean-rh1:/var/lib/pgsql]$ pg_probackup init -B /iihero/pg_probackup
INFO: Backup catalog '/iihero/pg_probackup' successfully initialized
[13:40:05-postgres@sean-rh1:/var/lib/pgsql]$ ls /iihero/pg_probackup/
backups wal
添加备份实例:
pg_probackup add-instance -B /iihero/pg_probackup -D /var/lib/pgsql/14/data --instance pg14.8
来个简单的archive模式的FULL备份
[13:54:31-postgres@sean-rh1:/var/lib/pgsql/14/data]$ pg_probackup backup -B /iihero/pg_probackup --instance pg14.8 -b FULL -h /tmp -U postgres --stream
INFO: Backup start, pg_probackup version: 2.5.12, instance: pg14.8, backup ID: S01YN2, backup mode: FULL, wal mode: STREAM, remote: false, compress-algorithm: none, compress-level: 1
WARNING: This PostgreSQL instance was initialized without data block checksums. pg_probackup have no way to detect data block corruption without them. Reinitialize PGDATA with option '--data-checksums'.
WARNING: Current PostgreSQL role is superuser. It is not recommended to run pg_probackup under superuser.
INFO: Database backup start
INFO: wait for pg_start_backup()
INFO: Wait for WAL segment /iihero/pg_probackup/backups/pg14.8/S01YN2/database/pg_wal/00000001000000000000002E to be streamed
INFO: PGDATA size: 35MB
INFO: Current Start LSN: 0/2E000028, TLI: 1
INFO: Start transferring data files
INFO: Data files are transferred, time elapsed: 0
INFO: wait for pg_stop_backup()
INFO: pg_stop backup() successfully executed
INFO: stop_lsn: 0/2E000168
INFO: Getting the Recovery Time from WAL
INFO: Syncing backup files to disk
INFO: Backup files are synced, time elapsed: 1s
INFO: Validating backup S01YN2
INFO: Backup S01YN2 data files are valid
INFO: Backup S01YN2 resident size: 51MB
INFO: Backup S01YN2 completed
[13:54:49-postgres@sean-rh1:/var/lib/pgsql/14/data]$
注意,上边需要补上一个"--stream",否则会卡在后边不动。
看着似乎能跑,对吧。好,我们重新编译一份。
2.2 调整--with-segsize 编译安装
./configure --with-openssl --prefix=/usr/pgsql-14-build2 --with-segsize=3
...
初始化一个新的实例:
[14:01:32-postgres@sean-rh1:/var/lib/pgsql/14]$ initdb -D data3g -E UTF8 --locale=C
修改配置文件,启用归档:
archive_mode = on
archive_command = 'cp %p /iihero/archive/data/%f'
启动之后:
-- 建一个普通的表模拟一下
postgres=# create table t(id int, col2 text);
CREATE TABLE
postgres=# insert into t select n, 'test123' || n || md5(random()::varchar) from generate_series(1, 30000000) as n;
2023-08-27 14:18:11.899 UTC [8943] LOG: checkpoints are occurring too frequently (7 seconds apart)
2023-08-27 14:18:11.899 UTC [8943] HINT: Consider increasing the configuration parameter "max_wal_size".
INSERT 0 30000000
postgres=# select pg_relation_filepath('t');
pg_relation_filepath
----------------------
base/13892/16391
(1 row)
postgres=# show data_directory;
data_directory
--------------------------
/var/lib/pgsql/14/data3g
(1 row)
postgres=# \! ls -la /var/lib/pgsql/14/data3g/base/13892/16391
-rw------- 1 postgres postgres 2533531648 Aug 27 14:19 /var/lib/pgsql/14/data3g/base/13892/16391
我们能看到,现在这个文件已经到了2.53G了。我们看看是否还能正常backup。
[14:25:33-postgres@sean-rh1:/iihero/pg_probackup]$ ls
backups wal
[14:25:33-postgres@sean-rh1:/iihero/pg_probackup]$ rm -rf *
[14:25:36-postgres@sean-rh1:/iihero/pg_probackup]$ pg_probackup init -B /iihero/pg_probackup
INFO: Backup catalog '/iihero/pg_probackup' successfully initialized
[14:26:04-postgres@sean-rh1:/iihero/pg_probackup]$ pg_probackup add-instance -B /iihero/pg_probackup -D /var/lib/pgsql/14/data3g --instance pg14.8
INFO: Instance 'pg14.8' successfully initialized
来个备份验证:
pg_probackup backup -B /iihero/pg_probackup --instance pg14.8 -b FULL -U postgres --stream
[14:26:28-postgres@sean-rh1:/iihero/pg_probackup]$ pg_probackup backup -B /iihero/pg_probackup --instance pg14.8 -b FULL -U postgres --stream
INFO: Backup start, pg_probackup version: 2.5.12, instance: pg14.8, backup ID: S0205E, backup mode: FULL, wal mode: STREAM, remote: false, compress-algorithm: none, compress-level: 1
WARNING: This PostgreSQL instance was initialized without data block checksums. pg_probackup have no way to detect data block corruption without them. Reinitialize PGDATA with option '--data-checksums'.
WARNING: Current PostgreSQL role is superuser. It is not recommended to run pg_probackup under superuser.
INFO: Database backup start
INFO: wait for pg_start_backup()
INFO: Wait for WAL segment /iihero/pg_probackup/backups/pg14.8/S0205E/database/pg_wal/00000001000000010000005A to be streamed
INFO: PGDATA size: 2442MB
INFO: Current Start LSN: 1/5A000028, TLI: 1
INFO: Start transferring data files
INFO: Data files are transferred, time elapsed: 4s
2023-08-27 14:27:20.804 UTC [9376] LOG: restore point "pg_probackup, backup_id S0205E" created at 1/5A000178
2023-08-27 14:27:20.804 UTC [9376] STATEMENT: SELECT pg_catalog.pg_create_restore_point($1)
INFO: wait for pg_stop_backup()
INFO: pg_stop backup() successfully executed
INFO: stop_lsn: 1/5A0001A0
INFO: Getting the Recovery Time from WAL
INFO: Syncing backup files to disk
INFO: Backup files are synced, time elapsed: 0
INFO: Validating backup S0205E
ERROR: Cannot seek block 261889 of "/iihero/pg_probackup/backups/pg14.8/S0205E/database/base/13892/16391": Invalid argument
ERROR: Data files validation failed
我们看到最后报错了:
ERROR: Cannot seek block 261889 of "/iihero/pg_probackup/backups/pg14.8/S0205E/database/base/13892/16391": Invalid argument
ERROR: Data files validation failed
这个不是跟数据文件大小超过2GB大小有关。
2.3 打上patch, 重新编译下pg_probackup
[14:35:10-postgres@sean-rh1:/iihero/source/postgresql-14.8/contrib]$ git clone https://github.com/hslightdb/pg_probackup
Cloning into 'pg_probackup'...
[14:35:46-postgres@sean-rh1:/iihero/source/postgresql-14.8/contrib/pg_probackup]$ git co merge510
Branch merge510 set up to track remote branch merge510 from origin.
Switched to a new branch 'merge510'
重新make 并 make install
现在重新验证pg_probackup,还是针对前边的超过2G大小的文件,我们看下:
[14:37:02-postgres@sean-rh1:/iihero/source/postgresql-14.8/contrib/pg_probackup]$ cd /iihero/pg_probackup/
[14:38:06-postgres@sean-rh1:/iihero/pg_probackup]$ ls
backups wal
[14:38:06-postgres@sean-rh1:/iihero/pg_probackup]$ rm -rf *
[14:38:09-postgres@sean-rh1:/iihero/pg_probackup]$ pg_probackup init -B /iihero/pg_probackup
INFO: Backup catalog '/iihero/pg_probackup' successfully inited
[14:38:16-postgres@sean-rh1:/iihero/pg_probackup]$ pg_probackup add-instance -B /iihero/pg_probackup -D /var/lib/pgsql/14/data3g --instance pg14.8
INFO: Instance 'pg14.8' successfully inited
[14:38:24-postgres@sean-rh1:/iihero/pg_probackup]$ pg_probackup backup -B /iihero/pg_probackup --instance pg14.8 -b FULL -U postgres --stream
INFO: Backup start, pg_probackup version: 2.5.9, instance: pg14.8, backup ID: S020OB, backup mode: FULL, wal mode: STREAM, remote: false, compress-algorithm: none, compress-level: 1
WARNING: This PostgreSQL instance was initialized without data block checksums. pg_probackup have no way to detect data block corruption without them. Reinitialize PGDATA with option '--data-checksums'.
WARNING: Current PostgreSQL role is superuser. It is not recommended to run pg_probackup under superuser.
INFO: Database backup start
INFO: wait for pg_start_backup()
INFO: Wait for WAL segment /iihero/pg_probackup/backups/pg14.8/S020OB/database/pg_wal/00000001000000010000005C to be streamed
INFO: PGDATA size: 2442MB
INFO: Current Start LSN: 1/5C000028, TLI: 1
INFO: Start transferring data files
INFO: Data files are transferred, time elapsed: 4s
2023-08-27 14:38:40.441 UTC [9650] LOG: restore point "pg_probackup, backup_id S020OB" created at 1/5C000178
2023-08-27 14:38:40.441 UTC [9650] STATEMENT: SELECT pg_catalog.pg_create_restore_point($1)
INFO: wait for pg_stop_backup()
INFO: pg_stop backup() successfully executed
INFO: stop_lsn: 1/5C0001A0
INFO: Getting the Recovery Time from WAL
INFO: Syncing backup files to disk
INFO: Backup files are synced, time elapsed: 0
INFO: Validating backup S020OB
INFO: Backup S020OB data files are valid
INFO: Backup S020OB resident size: 2461MB
INFO: Backup S020OB completed
最后我们看到了成功的消息哈。
至少证明那个patch是能工作的。
我这上边只是从那个PR的clone的branch里头拿到code。最好是自己去merge一下对应的fix比较好。
可以看到,用不了多外,这个fix应该会被纳入代码库当中。否则就自己动手patch一下也是可以的。
上边这些只是简单的印证一下思路,如果想要pg_probackup的完整的各种用法和使用技巧,那么在网上可以找到很多相关文档。
小结:
有时当搬运工,也是有好处的。可以真正看到各类开源库的进展状况。一般来说,PR频繁更新,意味着它是比较活跃的,如果遇到一个开源项目很长时间都不带更新的,可能会比较危险。
前段时间,在调研Odyssey连接池项目时,发现它对scram-sha-256的加密方式时支持的不是很好,而且很长时间没有对应的解决方案,顿时感觉对这个项目的兴趣就锐减,只能等它有真正的解决方案时再说了。
参考:
https://www.modb.pro/db/382367
https://zhuanlan.zhihu.com/p/531670776
https://github.com/postgrespro/pg_probackup/issues/609
https://github.com/postgrespro/pg_probackup/pull/510





