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

PostgreSQL的备份工具pg_probackup最新简介(关于数据文件大于2G)

数据库杂记 2023-08-27
112


前言:

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

图有点老。也基本可以看出pg_probackup与pgbackrest功能都很强大。

还有下边的一些总结性的原话:

  1. pg_dump/pg_dumpall + psql/pg restore和copy逻辑备份

  2. pg_ basebackup物理备份

  3. 第三方备份工具

  • 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 version2.5.12instance: pg14.8backup ID: S01YN2, backup modeFULL, wal mode: STREAM, remote: falsecompress-algorithm: nonecompress-level1
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'.
WARNINGCurrent 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/00000001000000000000002to be streamed
INFO: PGDATA size35MB
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 size51MB
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 [8943LOG:  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 version2.5.12instance: pg14.8backup ID: S0205E, backup modeFULL, wal mode: STREAM, remote: falsecompress-algorithm: nonecompress-level1
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'.
WARNINGCurrent 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/00000001000000010000005to be streamed
INFO: PGDATA size2442MB
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 [9376LOG:  restore point "pg_probackup, backup_id S0205E" created at 1/5A000178
2023-08-27 14:27:20.804 UTC [9376STATEMENT:  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
ERRORData 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 

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

评论