pg_basebackup

一个用于获取 PostgreSQL 数据目录快照的实用程序

pg_basebackup 是一个 核心工具,它通过流复制协议对运行中的 PostgreSQL 集群的数据目录进行“基础备份”——一个二进制快照。此基础备份通常用作原始集群的复制版本的基准;例如,在将运行中集群的数据复制到另一台服务器后,可以启动一个 PostgreSQL 实例,使用复制的数据作为其数据目录,并将其配置为复制备用。如果配置得当,此备用服务器将自动同步自基础备份创建以来的源服务器上的任何更改。

pg_basebackupPostgreSQL 9.1 中被添加。

请注意,尽管其名称包含“backup”(备份),pg_basebackup 本身并非备份工具;常规数据库备份应使用 pg_dumppg_dumpall,或者更好的是使用 Barman 或 pgBackRest 等实用程序。此外,pg_basebackup 只能对整个集群进行快照,而不能备份单个数据库或对象。pg_dump逻辑复制 是更适合此任务的工具。(然而,通过使用 pg_basebackup 来“启动”一个复制备用服务器,就可以从备用服务器进行备份,从而避免 pg_dump 等工具对主数据库造成的负载)。

为了能够进行基础备份,pg_basebackup 需要在运行中的集群上拥有一个超级用户或复制用户登录,并且在 pg_hba.conf 中定义了相应的连接权限。必须有足够的 walsender 进程可用(配置参数 max_wal_senders)。

默认情况下,pg_basebackup 会对原始集群中的所有文件和目录进行一对一的复制(选项 --format=plain),但它也可以将复制的数据输出为 tar 文件(选项 --format=tar)。有关 表空间 处理的注意事项,请参阅文档。

请注意,完成的基础备份将包含原始服务器数据目录中的任何配置文件,例如 postgresql.confpg_hba.conf 文件。在使用复制的数据目录启动 PostgreSQL 实例之前,可能需要调整或创建这些文件(以及 PostgreSQL 11 及更早版本中的 recovery.conf)。

进度监控

pg_basebackup 提供了 --progress 选项,以动态显示基础备份的进度,包括百分比和千字节。

PostgreSQL 13 开始,提供了一个 进度报告 视图 pg_stat_progress_basebackup,用于在源服务器上监控基础备份过程。

变更历史

  • PostgreSQL 17
    • 添加了选项 --sync-method(提交 8c16ad3b
    • 在提供的 conninfo 字符串中允许使用 dbname(提交 cca97ce6
    • 添加了选项 -i/--incremental(提交 dc212340
    • 现在可以通过 -R/--write-recovery-conf 选项在 conninfo 字符串中写入 dbname(提交 a145f424
  • PostgreSQL 15
    • 实现了新的 COPY 子协议(提交 cc333f32
    • 添加了选项 -t/--target(提交 3500ccc3
    • 选项 --compress 扩展为接受压缩方法和可选的压缩级别(提交 5c649fe1
    • 选项 --compress 除了 gzip 外,还可以接受 client-gzipserver-gzip(提交 0ad80329
    • 选项 --compress 可以接受 lz4server-lz4(提交 dab29847
    • 选项 --compress 可以接受 client-lz4(提交 751b8d23
    • 选项 --compress 可以接受 zstdclient-zstdserver-zstd(提交 7cf085f0
    • 选项 --compress 可以接受 (client|server)-zstd:workers=N 来提供多 zstd 工作进程的并行备份(提交 51c0d186
  • PostgreSQL 13
    • 为基础备份生成备份清单,可以使用新工具 pg_verifybackup 进行验证(提交 0d8c9c12) 
    • 默认显示总估计备份大小(提交 fab13dc5
    • 添加了选项 --no-estimate-size(提交 fab13dc5
  • PostgreSQL 12
  • PostgreSQL 11
    • 添加了选项 --create-slot,用于自动创建通过 --slot 选项指定的复制槽(提交 3709ca1c
  • PostgreSQL 10
    • 长选项 --xlog-method 重命名为 --wal-method(提交 62e8b387
    • 选项 --xlogdir 重命名为 --waldir(提交 62e8b387
    • 选项 -X/--wal-method 默认为 stream(提交 9a4d5107
    • 添加了选项 --no-slot(提交 e7b020f7
    • 移除了选项 -x(提交 9a4d5107
  • PostgreSQL 9.6
    • 添加了选项 --slot,用于在备份开始前预留一个复制槽(提交 0dc848b0
  • PostgreSQL 9.5
  • PostgreSQL 9.4
    • 添加了选项 --xlogdir,用于指定 pg_xlog 目录位置(提交 d1b88f6b
    • 添加了选项 -T/--tablespace-mapping,用于在目标服务器上重新定位 表空间(提交 fb05f3ce
    • 添加了选项 --max-rate,用于限制备份传输速率(提交 ef5856fd
  • PostgreSQL 9.3
    • 添加了选项 --write-recovery-conf,它会创建一个基本的 recovery.conf 文件(提交 915a29a1
    • 选项 --xlog-method 能够处理流式时间线切换(提交 0b632913
    • 添加了选项 -d/--dbname 以接受 conninfo 字符串(提交 aa05c37e
  • PostgreSQL 9.2
    • 能够从备用服务器进行基础备份(提交 8366c780
  • PostgreSQL 9.1

示例

postgres@node:~> pg_basebackup -h node1 -U repuser -D /path/to/local/datadir --wal-method=fetch --format=plain \
--label=backup_2023-03-26 --progress --verbose pg_basebackup: initiating base backup, waiting for checkpoint to complete pg_basebackup: checkpoint completed pg_basebackup: write-ahead log start point: 0/14000028 on timeline 1 pg_basebackup: starting background WAL receiver pg_basebackup: created temporary replication slot "pg_basebackup_877159" 165000/165000 kB (100%), 1/1 tablespace pg_basebackup: write-ahead log end point: 0/14000120 pg_basebackup: waiting for background process to finish streaming ... pg_basebackup: syncing data to disk ... pg_basebackup: renaming backup_manifest.tmp to backup_manifest pg_basebackup: base backup completed

请注意,在执行命令后,通常会有几秒钟的延迟,然后活动才会显示出来;这通常是因为 pg_basebackup 正在等待下一个 检查点 发生(可以使用选项 --checkpoint=fast 强制执行检查点)。

在 pg_basebackup 运行时,pg_stat_replication 会如下所示

postgres=# SELECT * FROM pg_stat_replication;
-[ RECORD 1 ]----+-----------------------------
pid              | 10770
usesysid         | 90766160
usename          | repuser
application_name | pg_basebackup
client_addr      | 192.168.1.33
client_hostname  | 
client_port      | 31933
backend_start    | 2023-03-27 02:34:53.29996+01
state            | backup
sent_location    | 0/0
write_location   | 
flush_location   | 
replay_location  | 
sync_priority    | 0
sync_state       | async

PostgreSQL 13 及更高版本中,可以通过 系统目录 视图 "pg_stat_progress_basebackup" 在源服务器上监控基础备份操作的进度,例如:

postgres=# SELECT * FROM pg_stat_progress_basebackup \gx
-[ RECORD 1 ]--------+-------------------------
pid                  | 29070
phase                | streaming database files
backup_total         | 2179629568
backup_streamed      | 945447936
tablespaces_total    | 1
tablespaces_streamed | 0

分类

备份, 核心工具, 管理 / 行政, 复制

另请参阅

pg_dump, pg_dumpall, pg_stat_progress_basebackup, pg_combinebackup

反馈

提交有关“pg_basebackup”的任何评论、建议或更正,请点击 这里