pg_dump是逻辑备份,pg_dump工具会导出数据库中的所有对象(如表、视图、函数等)及其数据,并生成一个包含创建这些对象和插入数据的SQL脚本。这种备份方式基于备份开始时的事务快照,因此它反映的是备份开始时的数据状态,即pg_dump备份数据的一致性时间点是备份开始的时候。
而pg_basebackup是物理备份,pg_basebackup 工具会复制整个数据目录,包括表空间、配置文件等,并且在备份过程中会记录和复制所有的WAL文件,以确保备份数据的一致性。这意味着 pg_basebackup 的备份数据不仅包括备份开始时的状态,还包括备份期间的所有更改,即pg_basebackup备份数据的一致性时间点是备份结束的时候。
pg_basebackup工作原理
- 启动备份时,强制生成一个检查点(Checkpoint),确保数据文件处于一致状态,并开启
full_page_writes
参数以支持后续恢复。 - 在数据目录中生成
backup_label
文件,记录备份的起始位置、时间线标识符(TLI)等元信息 - 通过 PostgreSQL 的流复制协议(Streaming Replication Protocol)与主库建立连接,后台进程
wal sender
负责将数据文件和 WAL文件直接传输到备份客户端。 - 如果在备份过程中有新的 WAL 文件生成,它们也会被复制到目标目录中。
- 一旦所有必要的数据和 WAL 文件都被复制,备份过程完成。目标目录将包含一个完整的、一致性的数据库快照。
注意点:
(1)依赖主库开启 full_page_writes
参数,保证即使发生部分页写入损坏,也能通过 WAL 日志恢复完整数据页。
(2)通过 -X stream
参数启动独立连接实时接收 WAL 日志,确保备份期间产生的 WAL 不丢失,从而支持时间点恢复(PITR)。
(3)执行备份的用户需具有 REPLICATION
权限或超级用户权限,且需在 pg_hba.conf
中允许复制连接。
(4)主库需配置足够的 max_wal_senders
以支持备份和 WAL 传输进程。
(5)pg_basebackup 支持从备库执行备份,但需确保备库开启 hot_standby
且主库开启 full_page_writes
,同时存在 WAL 归档完整性限制。
使用 pg_basebackup
使用 pg_basebackup
命令进行备份。基本的命令格式如下:
pg_basebackup -D <target-directory> -Fp -Xs -P -R -S <slotname> -d <connection-string>
其中参数说明:
-
-D
或--pgdata
指定备份的目标目录,即备份文件存放的位置。 -
-h
或--host
指定 PostgreSQL 服务器的主机名或 IP 地址。 -
-p
或--port
指定 PostgreSQL 服务器的端口号(默认是 5432)。 -
-U
或--username
指定连接 PostgreSQL 的用户名。 -
-w
或--no-password
不提示输入密码(适用于密码已配置在.pgpass
文件中)。 -
-W
或--password
强制提示输入密码。 -
-F
或--format
指定备份的输出格式:p
或plain
:普通格式,将文件直接复制到目标目录(默认)。t
或tar
:将备份打包为 tar 文件。
-
-X
或--wal-method
指定 WAL(Write-Ahead Logging)文件的传输方式:none
:不包含 WAL 文件。fetch
:在备份结束时获取所需的 WAL 文件。stream
:在备份过程中流式传输 WAL 文件(推荐)。
-
-P
或--progress
显示备份进度。 -
-v
或--verbose
输出详细的日志信息。 -
-j
或--jobs
指定并行备份的线程数(仅适用于tar
格式)。 -
-Z
或--compress
指定压缩级别(0-9),0 表示不压缩,9 表示最高压缩率(仅适用于tar
格式)。 -
-c
或--checkpoint
指定备份开始时的检查点模式:fast
:快速检查点(默认)。spread
:分散检查点,减少对性能的影响。
-
-l
或--label
为备份设置一个标签(通常用于标识备份)。 -
-R
或--write-recovery-conf
在备份目录中生成standby.signal
文件,并配置primary_conninfo
,用于设置从库。 -
-T
或--tablespace-mapping
将表空间重映射到新的位置(格式:OLD_LOCATION=NEW_LOCATION
)。 -
--slot
指定复制槽名称(用于流式备份时确保 WAL 文件不被删除)。 -
-C
在备份开始之前,强制 PostgreSQL 创建一个检查点,将所有脏页(dirty pages)刷新到磁盘,并确保 WAL(Write-Ahead Logging)文件是最新的。
与
-c
参数的区别-C
:在备份开始之前创建一个检查点。-c
:指定备份开始时的检查点模式(fast
或spread
),而不是强制创建检查点。
常用命令示例
-
基本备份
pg_basebackup -D /backup/path -U postgres -h 192.168.1.100 -p 5432
-
流式传输 WAL 文件
pg_basebackup -D /backup/path -X stream -U postgres
-
备份为 tar 格式并压缩
pg_basebackup -F t -Z 6 -D /backup/path -U postgres
-
并行备份
pg_basebackup -F t -j 4 -D /backup/path -U postgres
-
生成从库配置
pg_basebackup -D /backup/path -R -U postgres
-
常用的备份示例
pg_basebackup -h 127.0.0.1 -p 5432 -U repl -W -Ft -Z 6 -R -Xs -C --slot=myslot01 -P -v -l '20250309backup' -D /opt/bak/
Password:
pg_basebackup: initiating base backup, waiting for checkpoint to complete
pg_basebackup: checkpoint completed
pg_basebackup: write-ahead log start point: 0/16000028 on timeline 3
pg_basebackup: starting background WAL receiver
pg_basebackup: created replication slot "myslot01"
31394/31394 kB (100%), 1/1 tablespace
pg_basebackup: write-ahead log end point: 0/16000138
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-rw------- 1 postgres dba 181766 Mar 9 11:33 backup_manifest
-rw------- 1 postgres dba 4280493 Mar 9 11:33 base.tar.gz
-rw------- 1 postgres dba 18299 Mar 9 11:33 pg_wal.tar.gz