pg_basebackup
是一个 核心实用程序,它通过流式复制协议创建正在运行的PostgreSQL集群的数据目录的“基本备份” - 一个二进制快照。此基本备份通常用作复制的原始集群版本的依据;例如,在将正在运行的集群的数据复制到另一台服务器后,可以使用复制的数据作为其数据目录启动PostgreSQL实例,并将其配置为复制备用。如果配置正确,此备用服务器将自动同步源服务器自执行基本备份以来发生的任何更改。
pg_basebackup
添加于 PostgreSQL 9.1。
请注意,尽管名称如此,pg_basebackup
本身并非备份实用程序;应使用pg_dump
或pg_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.conf
和pg_hba.conf
文件。在使用复制的数据目录启动PostgreSQL实例之前,可能需要调整或创建这些文件(以及PostgreSQL 11及更早版本中的recovery.conf
)。
进度监控
pg_basebackup
提供了一个--progress
选项,用于动态显示基本备份的进度(以百分比和千字节为单位)。
从PostgreSQL 13 开始,可以使用进度报告视图pg_stat_progress_basebackup
监控源服务器上基本备份的过程。
更改历史
- PostgreSQL 17
- PostgreSQL 15
- 实现了新的
COPY
子协议(提交cc333f32) - 添加了选项
-t
/--target
(提交3500ccc3) - 将选项
--compress
扩展为接受压缩方法和可选的压缩级别(提交5c649fe1) - 选项
--compress
可以接受client-gzip
或server-gzip
以及gzip
(提交0ad80329) - 选项
--compress
可以接受lz4
或server-lz4
(提交dab29847) - 选项
--compress
可以接受client-lz4
(提交751b8d23) - 选项
--compress
可以接受zstd
、client-zstd
或server-zstd
(提交7cf085f0) - 选项
--compress
可以接受(client|server)-zstd:workers=N
以使用多个zstd工作进程提供并行备份(提交51c0d186)
- 实现了新的
- PostgreSQL 13
- 为基本备份生成备份清单,可以使用新的实用程序
pg_verifybackup
进行验证(提交0d8c9c12) - 默认情况下显示备份总估计大小(提交fab13dc5)
- 添加了选项
--no-estimate-size
(提交fab13dc5)
- 为基本备份生成备份清单,可以使用新的实用程序
- PostgreSQL 12
- 选项
--write-recovery-conf
现在会将其配置设置写入postgresql.auto.conf
(提交2dedf4d9)
- 选项
- PostgreSQL 11
- 添加了选项
--create-slot
,以自动创建使用--slot
选项指定的复制槽(提交3709ca1c)
- 添加了选项
- PostgreSQL 10
- PostgreSQL 9.6
- 添加了选项
--slot
以在开始备份之前预留复制槽(提交0dc848b0)
- 添加了选项
- PostgreSQL 9.5
- PostgreSQL 9.4
- PostgreSQL 9.3
- 添加了
--write-recovery-conf
选项,该选项创建一个基本recovery.conf 文件(提交915a29a1) --xlog-method
能够处理流式时间线切换(提交 0b632913)-d
/--dbname
选项添加了接受 conninfo 字符串的功能(提交 aa05c37e)
- 添加了
- PostgreSQL 9.2
- 能够从备用服务器创建基本备份(提交 8366c780)
- PostgreSQL 9.1
- 已添加(提交 048d148f)
示例
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
参考文献
- PostgreSQL 文档: pg_basebackup