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

使用 pg_probackup 备份 pg18.3 数据库

原创 飞天 1天前
56

同事在使用 pg_probackup 备份 pg18.3 数据库时碰到了问题,记录一下,供有需要的朋友参考!

安装pg_probackup

pg_probackup下载地址:https://github.com/postgrespro/pg_probackup

解压文件

tar -xzvf pg_probackup-2.5.16.tar.gz mv pg_probackup-2.5.16 pg_probackup

编译安装

cd pg_probackup make USE_PGXS=1 pg_config=<path_to_pg_config> top_srcdir=<path_to_postgresql_source_tree> make USE_PGXS=1 pg_config=<path_to_pg_config> top_srcdir=<path_to_postgresql_source_tree> install 注意: PG_CONFIG → 指向已安装好的 pg_config 二进制(部署目录) top_srcdir → 指向PG 源码解压目录(源码目录) make USE_PGXS=1 pg_config=/database/pg18/bin/pg_config top_srcdir=/database/postgresql-18.3 make USE_PGXS=1 pg_config=/database/pg18/bin/pg_config top_srcdir=/database/postgresql-18.3 install

编译过程中报错如下:

... src/utils/configuration.o src/utils/json.o src/utils/logger.o src/utils/parray.o src/utils/pgut.o src/utils/thread.o src/utils/remote.o src/utils/file.o src/archive.o src/backup.o src/catalog.o src/checkdb.o src/configure.o src/data.o src/delete.o src/dir.o src/fetch.o src/help.o src/init.o src/merge.o src/parsexlog.o src/ptrack.o src/pg_probackup.o src/restore.o src/show.o src/stream.o src/util.o src/validate.o src/datapagemap.o src/catchup.o src/pg_crc.o src/receivelog.o src/streamutil.o src/xlogreader.o src/walmethods.o -L/database/pg18/lib -lpq -pthread -D_REENTRANT -D_THREAD_SAFE -L/database/pg18/lib -Wl,--as-needed -Wl,-rpath,'/database/pg18/lib',--enable-new-dtags -lpgcommon -lpgport -lxslt -lxml2 -lz -lreadline -lpthread -lrt -ldl -lm -o pg_probackup src/pg_crc.o: In function `crc32_bytea': pg_crc.c:(.text+0x9): undefined reference to `pg_detoast_datum_packed' src/pg_crc.o: In function `crc32c_bytea': pg_crc.c:(.text+0xc9): undefined reference to `pg_detoast_datum_packed' collect2: error: ld returned 1 exit status make: *** [pg_probackup] Error 1

解决办法:
手动修改 pg_crc.c文件,过程如下:

cd pg_probackup vi src/pg_crc.c

找到:

Datum crc32_bytea(PG_FUNCTION_ARGS) { ... } Datum crc32c_bytea(PG_FUNCTION_ARGS) { ... }

改成:

#ifndef FRONTEND Datum crc32_bytea(PG_FUNCTION_ARGS) { ... } Datum crc32c_bytea(PG_FUNCTION_ARGS) { ... } #endif

接下来,继续编译:

[postgres@node1 pg_probackup]$ make clean Makefile:48: ../../src/Makefile.global: No such file or directory Makefile:49: ../../contrib/contrib-global.mk: No such file or directory make: *** No rule to make target `../../contrib/contrib-global.mk'. Stop. [postgres@node1 pg_probackup]$ make USE_PGXS=1 pg_config=/database/pg18/bin/pg_config top_srcdir=/database/postgresql-18.3 gcc -std=gnu99 -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Werror=vla -Wendif-labels -Wmissing-format-attribute -Wformat-security -fno-strict-aliasing -fwrapv -fexcess-precision=standard -O2 -DFRONTEND -I. -I./ -I/database/pg18/include/postgresql/server -I/database/pg18/include/postgresql/internal -D_GNU_SOURCE -I/usr/include/libxml2 -I/database/pg18/include -pthread -D_REENTRANT -D_THREAD_SAFE -Isrc -I/database/postgresql-18.3//src -c -o src/pg_crc.o src/pg_crc.c gcc -std=gnu99 -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Werror=vla -Wendif-labels -Wmissing-format-attribute -Wformat-security -fno-strict-aliasing -fwrapv -fexcess-precision=standard -O2 src/utils/configuration.o src/utils/json.o src/utils/logger.o src/utils/parray.o src/utils/pgut.o src/utils/thread.o src/utils/remote.o src/utils/file.o src/archive.o src/backup.o src/catalog.o src/checkdb.o src/configure.o src/data.o src/delete.o src/dir.o src/fetch.o src/help.o src/init.o src/merge.o src/parsexlog.o src/ptrack.o src/pg_probackup.o src/restore.o src/show.o src/stream.o src/util.o src/validate.o src/datapagemap.o src/catchup.o src/pg_crc.o src/receivelog.o src/streamutil.o src/xlogreader.o src/walmethods.o -L/database/pg18/lib -lpq -pthread -D_REENTRANT -D_THREAD_SAFE -L/database/pg18/lib -Wl,--as-needed -Wl,-rpath,'/database/pg18/lib',--enable-new-dtags -lpgcommon -lpgport -lxslt -lxml2 -lz -lreadline -lpthread -lrt -ldl -lm -o pg_probackup [postgres@node1 pg_probackup]$ make USE_PGXS=1 pg_config=/database/pg18/bin/pg_config top_srcdir=/database/postgresql-18.3 install /bin/mkdir -p '/database/pg18/bin' /bin/install -c pg_probackup '/database/pg18/bin'

可以看到,已经编译成功。

检查pg_probackup版本

[postgres@node1 pg_probackup]$ pg_probackup -V pg_probackup 2.5.16 (PostgreSQL 18.3)

备份准备

创建备份用户并授权

使用postgres用户连接到数据库执行:

CREATE ROLE rep WITH LOGIN REPLICATION; grant USAGE ON SCHEMA pg_catalog to rep; grant EXECUTE ON FUNCTION pg_catalog.current_setting(text) to rep; grant EXECUTE ON FUNCTION pg_catalog.pg_is_in_recovery() to rep; grant EXECUTE ON FUNCTION pg_catalog.pg_backup_start(text, boolean) to rep; grant EXECUTE ON FUNCTION pg_catalog.pg_backup_stop(boolean) to rep; grant EXECUTE ON FUNCTION pg_catalog.pg_create_restore_point(text) to rep; grant EXECUTE ON FUNCTION pg_catalog.pg_switch_wal() to rep; grant EXECUTE ON FUNCTION pg_catalog.pg_last_wal_replay_lsn() to rep; grant EXECUTE ON FUNCTION pg_catalog.txid_current() to rep; grant EXECUTE ON FUNCTION pg_catalog.txid_current_snapshot() to rep; grant EXECUTE ON FUNCTION pg_catalog.txid_snapshot_xmax(txid_snapshot) to rep; grant EXECUTE ON FUNCTION pg_catalog.pg_control_checkpoint() to rep; grant pg_checkpoint TO rep; grant pg_read_all_settings TO rep;

配置pg_hba.conf

vi pg_hba.conf加入:

host all rep 192.*.*.60/32 scram-sha-256 host replication all 192.*.*.60/32 scram-sha-256

配置生效:

select pg_reload_conf();

创建备份目录

mkdir /home/postgres/bak

初始化备份目录:

pg_probackup init -B /home/postgres/bak

初始化后会在/home/postgres/bak目录下生产两个文件:

[postgres@node1 ~]$ ll /home/postgres/bak total 0 drwx------ 4 postgres postgres 36 Sep 11 17:32 backups drwx------ 4 postgres postgres 36 Sep 11 17:32 wal [postgres@node1 ~]$

添加备份实例

pg_probackup add-instance -B /home/postgres/bak -D /database/data --instance pg18

执行后,会在backups、wal目录下新建 --instance参数 指定的目录

[postgres@node1 bak]$ ll backups wal backups: total 0 drwx------ 2 postgres postgres 31 Sep 11 17:37 pg18 wal: total 0 drwx------ 2 postgres postgres 6 Sep 11 17:37 pg18

备份数据库

pg_probackup backup -B /home/postgres/bak -D /database/data --instance pg18 -U rep -b full --stream

执行过程如下:

[postgres@node1 bak]$ pg_probackup backup -B /home/postgres/bak -D /database/data --instance pg18 -U rep -b full --stream INFO: Backup start, pg_probackup version: 2.5.16, instance: pg18, backup ID: TL71JZ, backup mode: FULL, wal mode: STREAM, remote: false, compress-algorithm: none, compress-level: 1 INFO: This PostgreSQL instance was initialized with data block checksums. Data block corruption will be detected INFO: Database backup start INFO: wait for pg_backup_start() INFO: Wait for WAL segment /home/postgres/bak/backups/pg18/TL71JZ/database/pg_wal/000000010000000000000015 to be streamed INFO: PGDATA size: 23MB INFO: Current Start LSN: 0/15000028, 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/15000188 INFO: Getting the Recovery Time from WAL INFO: Syncing backup files to disk INFO: Backup files are synced, time elapsed: 0 INFO: Validating backup TL71JZ INFO: Backup TL71JZ data files are valid INFO: Backup TL71JZ resident size: 55MB INFO: Backup TL71JZ completed [postgres@node1 bak]$

检查备份集

pg_probackup show -B -B /home/postgres/bak --instance=pg18

执行过程如下:

[postgres@node1 bak]$ pg_probackup show -B /home/postgres/bak --instance=pg18 ================================================================================================================================== Instance Version ID Recovery Time Mode WAL Mode TLI Time Data WAL Zratio Start LSN Stop LSN Status ================================================================================================================================== pg18 18 TL71JZ 2026-09-11 17:40:48+08 FULL STREAM 1/0 6s 23MB 32MB 1.00 0/15000028 0/15000188 OK [postgres@node1 bak]$

pg_probackup命令参考

[postgres@node1 ~]$ pg_probackup --help pg_probackup - utility to manage backup/recovery of PostgreSQL database. pg_probackup help [COMMAND] pg_probackup version pg_probackup init -B backup-dir pg_probackup set-config -B backup-dir --instance=instance-name [-D pgdata-path] [--external-dirs=external-directories-paths] [--log-level-console=log-level-console] [--log-level-file=log-level-file] [--log-format-file=log-format-file] [--log-filename=log-filename] [--error-log-filename=error-log-filename] [--log-directory=log-directory] [--log-rotation-size=log-rotation-size] [--log-rotation-age=log-rotation-age] [--retention-redundancy=retention-redundancy] [--retention-window=retention-window] [--wal-depth=wal-depth] [--compress-algorithm=compress-algorithm] [--compress-level=compress-level] [--archive-timeout=timeout] [-d dbname] [-h host] [-p port] [-U username] [--remote-proto] [--remote-host] [--remote-port] [--remote-path] [--remote-user] [--ssh-options] [--restore-command=cmdline] [--archive-host=destination] [--archive-port=port] [--archive-user=username] [--help] pg_probackup set-backup -B backup-dir --instance=instance-name -i backup-id [--ttl=interval] [--expire-time=timestamp] [--note=text] [--help] pg_probackup show-config -B backup-dir --instance=instance-name [--format=format] [--no-scale-units] [--help] pg_probackup backup -B backup-dir -b backup-mode --instance=instance-name [-D pgdata-path] [-C] [--stream [-S slot-name] [--temp-slot]] [--backup-pg-log] [-j num-threads] [--progress] [--no-validate] [--skip-block-validation] [--external-dirs=external-directories-paths] [--no-sync] [--log-level-console=log-level-console] [--log-level-file=log-level-file] [--log-format-console=log-format-console] [--log-format-file=log-format-file] [--log-filename=log-filename] [--error-log-filename=error-log-filename] [--log-directory=log-directory] [--log-rotation-size=log-rotation-size] [--log-rotation-age=log-rotation-age] [--no-color] [--delete-expired] [--delete-wal] [--merge-expired] [--retention-redundancy=retention-redundancy] [--retention-window=retention-window] [--wal-depth=wal-depth] [--compress] [--compress-algorithm=compress-algorithm] [--compress-level=compress-level] [--archive-timeout=archive-timeout] [-d dbname] [-h host] [-p port] [-U username] [-w --no-password] [-W --password] [--remote-proto] [--remote-host] [--remote-port] [--remote-path] [--remote-user] [--ssh-options] [--ttl=interval] [--expire-time=timestamp] [--note=text] [--help] pg_probackup restore -B backup-dir --instance=instance-name [-D pgdata-path] [-i backup-id] [-j num-threads] [--recovery-target-time=time|--recovery-target-xid=xid |--recovery-target-lsn=lsn [--recovery-target-inclusive=boolean]] [--recovery-target-timeline=timeline] [--recovery-target=immediate|latest] [--recovery-target-name=target-name] [--recovery-target-action=pause|promote|shutdown] [--restore-command=cmdline] [-R | --restore-as-replica] [--force] [--primary-conninfo=primary_conninfo] [-S | --primary-slot-name=slotname] [--no-validate] [--skip-block-validation] [-T OLDDIR=NEWDIR] [--progress] [--external-mapping=OLDDIR=NEWDIR] [--skip-external-dirs] [--no-sync] [-X WALDIR | --waldir=WALDIR] [-I | --incremental-mode=none|checksum|lsn] [--db-include | --db-exclude] [--destroy-all-other-dbs] [--remote-proto] [--remote-host] [--remote-port] [--remote-path] [--remote-user] [--ssh-options] [--archive-host=hostname] [--archive-port=port] [--archive-user=username] [--help] pg_probackup validate -B backup-dir [--instance=instance-name] [-i backup-id] [--progress] [-j num-threads] [--recovery-target-time=time|--recovery-target-xid=xid |--recovery-target-lsn=lsn [--recovery-target-inclusive=boolean]] [--recovery-target-timeline=timeline] [--recovery-target-name=target-name] [--skip-block-validation] [--help] pg_probackup checkdb [-B backup-dir] [--instance=instance-name] [-D pgdata-path] [--progress] [-j num-threads] [--amcheck] [--skip-block-validation] [--heapallindexed] [--checkunique] [--help] pg_probackup show -B backup-dir [--instance=instance-name [-i backup-id]] [--format=format] [--archive] [--no-color] [--help] pg_probackup delete -B backup-dir --instance=instance-name [-j num-threads] [--progress] [--retention-redundancy=retention-redundancy] [--retention-window=retention-window] [--wal-depth=wal-depth] [-i backup-id | --delete-expired | --merge-expired | --status=backup_status] [--delete-wal] [--dry-run] [--no-validate] [--no-sync] [--help] pg_probackup merge -B backup-dir --instance=instance-name -i backup-id [--progress] [-j num-threads] [--no-validate] [--no-sync] [--help] pg_probackup add-instance -B backup-dir -D pgdata-path --instance=instance-name [--external-dirs=external-directories-paths] [--remote-proto] [--remote-host] [--remote-port] [--remote-path] [--remote-user] [--ssh-options] [--help] pg_probackup del-instance -B backup-dir --instance=instance-name [--help] pg_probackup archive-push -B backup-dir --instance=instance-name --wal-file-name=wal-file-name [--wal-file-path=wal-file-path] [-j num-threads] [--batch-size=batch_size] [--archive-timeout=timeout] [--no-ready-rename] [--no-sync] [--overwrite] [--compress] [--compress-algorithm=compress-algorithm] [--compress-level=compress-level] [--remote-proto] [--remote-host] [--remote-port] [--remote-path] [--remote-user] [--ssh-options] [--help] pg_probackup archive-get -B backup-dir --instance=instance-name --wal-file-path=wal-file-path --wal-file-name=wal-file-name [-j num-threads] [--batch-size=batch_size] [--no-validate-wal] [--remote-proto] [--remote-host] [--remote-port] [--remote-path] [--remote-user] [--ssh-options] [--help] pg_probackup catchup -b catchup-mode --source-pgdata=path_to_pgdata_on_remote_server --destination-pgdata=path_to_local_dir [--stream [-S slot-name] [--temp-slot | --perm-slot]] [-j num-threads] [-T OLDDIR=NEWDIR] [--exclude-path=path_prefix] [-d dbname] [-h host] [-p port] [-U username] [-w --no-password] [-W --password] [--remote-proto] [--remote-host] [--remote-port] [--remote-path] [--remote-user] [--ssh-options] [--dry-run] [--help]

参考文档

https://www.postgresql.org/message-id/ME0P300MB0445018F5C924B2D88983F45B66CA%40ME0P300MB0445.AUSP300.PROD.OUTLOOK.COM

关于作者

网名:飞天,墨天轮2024年度、2025年度优秀原创作者,拥有 Oracle 10g OCM 认证、PGCE认证、MySQL 8.0 OCP认证以及OBCA、KCP、KCSM、ACP、YCP、HCIP-openGauss、HCCDP-GaussDB、磐维等众多国产数据库认证证书,目前从事Oracle、Mysql、PostgreSQL、磐维数据库管理运维工作,喜欢结交更多志同道合的朋友,热衷于研究、分享数据库技术。
微信公众号:飞天online
墨天轮:https://www.modb.pro/u/15197
如有任何疑问,欢迎大家留言,共同探讨~~~

最后修改时间:2026-09-14 09:34:35
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论