pg_basebackup — 获取 PostgreSQL 集群的基础备份
pg_basebackup
[选项
...]
pg_basebackup 用于获取正在运行的 PostgreSQL 数据库集群的基础备份。该备份的获取不会影响数据库的其他客户端,并且可用于时间点恢复(请参阅第 25.3 节)以及作为日志传送或流复制备用服务器的起点(请参阅第 26.2 节)。
pg_basebackup 可以获取数据库的完整或增量基础备份。当用于获取完整备份时,它会创建数据库集群文件的精确副本。当用于获取增量备份时,一些原本属于完整备份的文件可能会被相同文件的增量版本替换,其中仅包含自参考备份以来已修改的块。增量备份不能直接使用;相反,必须首先使用pg_combinebackup将其与它所依赖的先前备份合并。有关增量备份的更多信息,请参阅第 25.3.3 节,有关从备份恢复的步骤,请参阅第 25.3.5 节。
在任何模式下,pg_basebackup 都会确保服务器自动进入和退出备份模式。备份始终是针对整个数据库集群进行的;无法备份单个数据库或数据库对象。对于选择性备份,必须使用另一个工具,如 pg_dump。
备份是通过使用复制协议的常规 PostgreSQL 连接进行的。连接必须使用具有 REPLICATION
权限(请参阅第 21.2 节)或超级用户的用户 ID 进行,并且 pg_hba.conf
必须允许复制连接。还必须将服务器配置为 max_wal_senders 设置得足够高,以便为备份提供至少一个 walsender,并为 WAL 流(如果使用)提供一个 walsender。
可以同时运行多个 pg_basebackup
,但从性能角度来看,通常最好只进行一个备份,然后复制结果。
pg_basebackup 不仅可以从主服务器获取基础备份,还可以从备用服务器获取。要从备用服务器获取备份,请设置备用服务器,使其可以接受复制连接(即设置 max_wal_senders
和 hot_standby,并适当配置其 pg_hba.conf
)。您还需要在主服务器上启用 full_page_writes。
请注意,从备用服务器获取备份存在一些限制
备份历史记录文件不会在备份的数据库集群中创建。
pg_basebackup 无法强制备用服务器在备份结束时切换到新的 WAL 文件。当您使用 -X none
时,如果主服务器上的写入活动较低,则 pg_basebackup 可能需要等待很长时间才能切换和归档备份所需的最后一个 WAL 文件。在这种情况下,在主服务器上运行 pg_switch_wal
以触发立即的 WAL 文件切换可能很有用。
如果在备份期间将备用服务器提升为主服务器,则备份将失败。
备份所需的所有 WAL 记录都必须包含足够的完整页面写入,这需要您在主服务器上启用 full_page_writes
。
每当 pg_basebackup 正在进行基础备份时,服务器的 pg_stat_progress_basebackup
视图将报告备份的进度。有关详细信息,请参阅第 27.4.6 节。
以下命令行选项控制输出的位置和格式
-D 目录
--pgdata=目录
设置要将输出写入的目标目录。如果目标目录不存在,pg_basebackup 将创建此目录(以及任何缺失的父目录)。如果它已存在,则必须为空。
当备份为 tar 格式时,可以将目标目录指定为 -
(破折号),从而导致 tar 文件写入 stdout
。
此选项是必需的。
-F 格式
--format=格式
选择输出格式。格式
可以是以下之一
p
plain
将输出写入为纯文件,其布局与源服务器的数据目录和表空间相同。当集群没有其他表空间时,整个数据库将放置在目标目录中。如果集群包含其他表空间,则主数据目录将放置在目标目录中,但所有其他表空间将放置在与源服务器上相同的绝对路径中。(请参阅 --tablespace-mapping
以更改此设置。)
这是默认格式。
t
tar
将输出写入为目标目录中的 tar 文件。主数据目录的内容将写入名为 base.tar
的文件,每个其他表空间将写入一个单独的 tar 文件,该文件以该表空间的 OID 命名。
如果将目标目录指定为 -
(破折号),则 tar 内容将写入标准输出,适合管道传输到(例如)gzip。仅当集群没有其他表空间并且未使用 WAL 流时,才允许这样做。
-i 旧清单文件
--incremental=旧清单文件
执行增量备份。必须提供参考备份的备份清单,并且将上传到服务器,服务器将通过发送请求的增量备份来响应。
-R
--write-recovery-conf
创建一个 standby.signal
文件,并将连接设置附加到目标目录中的 postgresql.auto.conf
文件中(或者在使用 tar 格式时在基本归档文件中)。这可以简化使用备份结果设置备用服务器的过程。
postgresql.auto.conf
文件将记录连接设置,以及(如果指定)pg_basebackup 正在使用的复制槽,以便流复制和逻辑复制槽同步稍后使用相同的设置。只有在连接字符串或环境变量中明确指定了 dbname,才会记录 dbname。
-t 目标
--target=目标
指示服务器将基础备份放置在哪里。默认目标是 client
,它指定备份应发送到 pg_basebackup 正在运行的计算机。如果将目标设置为 server:/some/path
,则备份将存储在服务器正在运行的计算机上的 /some/path
目录中。在服务器上存储备份需要超级用户权限或具有 pg_write_server_files
角色的权限。如果将目标设置为 blackhole
,则内容将被丢弃,并且不会存储在任何地方。这仅应用于测试目的,因为您最终不会得到实际的备份。
由于 WAL 流是由 pg_basebackup 而不是服务器实现的,因此此选项不能与 -Xstream
一起使用。由于这是默认设置,因此在指定此选项时,您还必须指定 -Xfetch
或 -Xnone
。
-T 旧目录
=新目录
--tablespace-mapping=旧目录
=新目录
在备份期间,将表空间从目录 olddir
重新定位到 newdir
。为了生效,olddir
必须与源服务器上定义的表空间路径规范完全匹配。(但如果源服务器上 olddir
中没有表空间,则不会报错。)同时,newdir
是接收主机文件系统中的一个目录。与主目标目录一样,newdir
不需要预先存在,但如果它存在,则必须为空。 olddir
和 newdir
都必须是绝对路径。如果任何路径需要包含等号(=
),请在其前面加上反斜杠。可以多次指定此选项以用于多个表空间。
如果以这种方式重新定位表空间,则主数据目录内的符号链接将被更新以指向新位置。因此,新的数据目录已准备好用于新的服务器实例,且所有表空间都位于更新的位置。
目前,此选项仅适用于纯文本输出格式;如果选择 tar 格式,则会忽略此选项。
--waldir=waldir
设置写入 WAL(预写日志)文件的目录。默认情况下,WAL 文件将放置在目标目录的 pg_wal
子目录中,但可以使用此选项将它们放置在其他位置。waldir
必须是绝对路径。与主目标目录一样,waldir
不需要预先存在,但如果它存在,则必须为空。此选项只能在备份采用纯文本格式时指定。
-X method
--wal-method=method
在备份中包含所需的 WAL(预写日志)文件。这将包括备份期间生成的所有预写日志。除非指定了方法 none
,否则可以在目标目录中启动 postmaster,而无需查阅 WAL 存档,从而使输出成为完全独立的备份。
支持以下用于收集预写日志的 method
:
n
none
不在备份中包含预写日志。
f
fetch
预写日志文件在备份结束时收集。因此,有必要将源服务器的 wal_keep_size 参数设置得足够高,以便在备份结束之前不会删除所需的日志数据。如果所需的日志数据在传输之前被回收,则备份将失败且无法使用。
当使用 tar 格式时,预写日志文件将包含在 base.tar
文件中。
s
stream
在执行备份时流式传输预写日志数据。此方法将打开与服务器的第二个连接,并在运行备份的同时并行开始流式传输预写日志。因此,它将需要两个复制连接,而不仅仅是一个。只要客户端能够跟上预写日志数据的速度,使用此方法就不需要在源服务器上保存额外的预写日志。
当使用 tar 格式时,预写日志文件将写入名为 pg_wal.tar
的单独文件中(如果服务器的版本早于 10,则该文件将命名为 pg_xlog.tar
)。
此值为默认值。
-z
--gzip
启用 tar 文件输出的 gzip 压缩,采用默认压缩级别。仅在使用 tar 格式时才可进行压缩,并且后缀 .gz
将自动添加到所有 tar 文件名中。
-Z level
-Z [{client|server}-]method
[:detail
]
--compress=level
--compress=[{client|server}-]method
[:detail
]
请求压缩备份。如果包含 client
或 server
,则指定在哪里执行压缩。在服务器上进行压缩将减少传输带宽,但会增加服务器 CPU 消耗。默认值为 client
,除非使用 --target
。在这种情况下,备份不会发送到客户端,因此只有服务器压缩才是合理的。当使用 -Xstream
(默认值)时,服务器端压缩将不会应用于 WAL。要压缩 WAL,请使用客户端压缩,或指定 -Xfetch
。
压缩方法可以设置为 gzip
、lz4
、zstd
、none
(表示不压缩)或一个整数(如果为 0 则不压缩,如果大于 0 则为 gzip
)。可以选择指定压缩详细信息字符串。如果详细信息字符串是一个整数,则指定压缩级别。否则,它应该是一个逗号分隔的项目列表,每个项目的形式为 keyword
或 keyword=value
。目前,支持的关键字是 level
、long
和 workers
。当压缩方法被指定为纯整数时,不能使用详细信息字符串。
如果未指定压缩级别,则将使用默认压缩级别。如果仅指定一个级别而未提及算法,则如果该级别大于 0,则将使用 gzip
压缩,如果该级别为 0,则不使用压缩。
当 tar 格式与 gzip
、lz4
或 zstd
一起使用时,后缀 .gz
、.lz4
或 .zst
将分别自动添加到所有 tar 文件名中。当使用纯文本格式时,不能指定客户端压缩,但仍然可以请求服务器端压缩。如果这样做,服务器将压缩备份以进行传输,并且客户端将解压缩并提取它。
当此选项与 -Xstream
组合使用时,如果选择客户端 gzip 压缩,则将使用 gzip
压缩 pg_wal.tar
,但如果选择任何其他压缩算法或选择服务器端压缩,则不会压缩。
以下命令行选项控制备份的生成和程序的调用
-c {fast|spread}
--checkpoint={fast|spread}
将检查点模式设置为 fast(立即)或 spread(默认)(请参阅第 25.3.4 节)。
-C
--create-slot
指定应在开始备份之前创建由 --slot
选项命名的复制槽。如果该槽已存在,则会引发错误。
-l label
--label=label
设置备份的标签。如果未指定标签,则将使用默认值 ““pg_basebackup base backup
””。
-n
--no-clean
默认情况下,当 pg_basebackup
因错误而中止时,它会删除在发现无法完成作业之前可能已创建的任何目录(例如,目标目录和预写日志目录)。此选项会阻止清理,因此对于调试很有用。
请注意,表空间目录无论如何都不会被清理。
-N
--no-sync
默认情况下,pg_basebackup
将等待所有文件安全写入磁盘。此选项导致 pg_basebackup
不等待而返回,这会更快,但这意味着后续的操作系统崩溃可能会使基本备份损坏。通常,此选项对于测试很有用,但不应在创建生产安装时使用。
-P
--progress
启用进度报告。启用此选项将在备份期间提供近似的进度报告。由于数据库在备份期间可能会发生更改,因此这只是一个近似值,并且可能不会正好在 100%
处结束。特别是,当 WAL 日志包含在备份中时,无法预先估计数据总量,在这种情况下,一旦超过不包含 WAL 的总估计值,估计目标大小就会增加。
-r rate
--max-rate=rate
设置从源服务器收集数据的最大传输速率。这对于限制 pg_basebackup 对服务器的影响非常有用。值以千字节/秒为单位。使用后缀 M
表示兆字节/秒。也接受后缀 k
,但没有效果。有效值介于 32 千字节/秒和 1024 兆字节/秒之间。
此选项始终会影响数据目录的传输。仅当收集方法为 fetch
时,才会影响 WAL 文件的传输。
-S slotname
--slot=slotname
此选项只能与 -X stream
一起使用。它导致 WAL 流使用指定的复制槽。如果基本备份旨在用作使用复制槽的流复制备用服务器,则备用服务器应使用与 primary_slot_name 相同的复制槽名称。这可以确保主服务器不会在基本备份结束和新备用服务器上启动流复制之间的时间内删除任何必要的 WAL 数据。
除非也使用选项 -C
,否则指定的复制槽必须存在。
如果未指定此选项,并且服务器支持临时复制槽(版本 10 及更高版本),则会自动使用临时复制槽进行 WAL 流。
--sync-method=method
当设置为 fsync
(默认值)时,pg_basebackup
将递归打开并同步备份目录中的所有文件。当使用纯文本格式时,文件搜索将遵循 WAL 目录和每个配置的表空间的符号链接。
在 Linux 上,可以使用 syncfs
来要求操作系统同步包含备份目录的整个文件系统。当使用纯文本格式时,pg_basebackup
还会同步包含 WAL 文件和每个表空间的文件系统。有关使用 syncfs
时需要注意的事项的信息,请参阅 recovery_init_sync_method。
当使用 --no-sync
时,此选项不起作用。
-v
--verbose
启用详细模式。将在启动和关闭期间输出一些额外的步骤,如果还启用了进度报告,则会显示当前正在处理的确切文件名。
--manifest-checksums=算法
指定应应用于备份清单中包含的每个文件的校验和算法。当前,可用的算法为 NONE
、CRC32C
、SHA224
、SHA256
、SHA384
和 SHA512
。默认值为 CRC32C
。
如果选择 NONE
,则备份清单将不包含任何校验和。否则,它将包含备份中每个文件的校验和,使用指定的算法。此外,清单将始终包含其自身内容的 SHA256
校验和。SHA
算法比 CRC32C
更消耗 CPU 资源,因此选择其中一种算法可能会增加完成备份所需的时间。
使用 SHA 哈希函数为希望验证备份是否被篡改的用户提供了每个文件的加密安全摘要,而 CRC32C 算法提供了一种计算速度更快的校验和;它擅长捕获由于意外更改而导致的错误,但无法抵抗恶意修改。请注意,为了有效地对抗可以访问备份的攻击者,备份清单需要安全地存储在其他地方,或者以其他方式验证自备份以来未被修改。
可以使用 pg_verifybackup 来检查备份相对于备份清单的完整性。
--manifest-force-encode
强制备份清单中的所有文件名都进行十六进制编码。如果未指定此选项,则仅对非 UTF8 文件名进行十六进制编码。此选项主要用于测试读取备份清单文件的工具是否正确处理这种情况。
--no-estimate-size
阻止服务器估计将要流式传输的备份数据总量,从而导致 pg_stat_progress_basebackup
视图中的 backup_total
列始终为 NULL
。
如果没有此选项,备份将首先枚举整个数据库的大小,然后返回并发送实际内容。这可能会使备份花费稍长的时间,尤其是在发送第一个数据之前需要更长的时间。如果估计时间过长,此选项可用于避免此类估计时间。
使用 --progress
时不允许使用此选项。
--no-manifest
禁用生成备份清单。如果未指定此选项,服务器将生成并发送可以使用 pg_verifybackup 验证的备份清单。清单是备份中存在的每个文件的列表,但可能包含的任何 WAL 文件除外。它还存储每个文件的大小、上次修改时间和可选的校验和。
--no-slot
阻止为备份创建临时复制槽。
默认情况下,如果选择了日志流但没有使用 -S
选项给出槽名称,则会创建一个临时复制槽(如果源服务器支持)。
此选项的主要目的是允许在服务器没有空闲复制槽时进行基本备份。使用复制槽几乎总是首选的,因为它可以防止服务器在备份期间删除所需的 WAL。
--no-verify-checksums
禁用校验和的验证,如果校验和在从中获取基本备份的服务器上启用。
默认情况下,校验和会被验证,并且校验和失败将导致非零退出状态。但是,在这种情况下不会删除基本备份,就像使用了 --no-clean
选项一样。校验和验证失败也会在 pg_stat_database
视图中报告。
以下命令行选项控制与源服务器的连接
-d connstr
--dbname=connstr
指定用于连接到服务器的参数,作为连接字符串;这些参数将覆盖任何冲突的命令行选项。
为了与其他客户端应用程序保持一致,此选项称为 --dbname
,但由于 pg_basebackup 不连接到集群中的任何特定数据库,因此服务器会忽略连接字符串中包含的任何数据库名称。但是,以这种方式提供的数据库名称会覆盖默认数据库名称(replication
),以便在 ~/.pgpass
中查找复制连接的密码。同样,用于连接到 PostgreSQL 的中间件或代理可能会使用该名称进行诸如连接路由之类的操作。数据库名称也可以由 逻辑复制槽同步使用。
-h host
--host=host
指定运行服务器的计算机的主机名。如果该值以斜杠开头,则将其用作 Unix 域套接字的目录。默认值取自 PGHOST
环境变量(如果已设置),否则会尝试进行 Unix 域套接字连接。
-p port
--port=port
指定服务器侦听连接的 TCP 端口或本地 Unix 域套接字文件扩展名。默认为 PGPORT
环境变量(如果已设置),或编译到默认值。
-s interval
--status-interval=interval
指定发送回源服务器的状态数据包之间的秒数。较小的值可以更准确地监控服务器的备份进度。值为零将完全禁用定期状态更新,但当服务器请求时仍将发送更新,以避免基于超时的断开连接。默认值为 10 秒。
-U username
--username=username
指定要连接的用户名。
-w
--no-password
阻止发出密码提示。如果服务器需要密码验证,并且没有其他方式(例如 .pgpass
文件)提供密码,则连接尝试将失败。此选项在没有用户输入密码的批处理作业和脚本中非常有用。
-W
--password
强制 pg_basebackup 在连接到源服务器之前提示输入密码。
此选项并非必不可少,因为如果服务器要求密码验证,pg_basebackup 将自动提示输入密码。但是,pg_basebackup 会浪费一次连接尝试来找出服务器是否需要密码。在某些情况下,值得键入 -W
以避免额外的连接尝试。
还有其他选项可用
-V
--version
打印 pg_basebackup 版本并退出。
-?
--help
显示有关 pg_basebackup 命令行参数的帮助并退出。
此实用程序与大多数其他 PostgreSQL 实用程序一样,使用 libpq 支持的环境变量(请参阅 第 32.15 节)。
环境变量 PG_COLOR
指定是否在诊断消息中使用颜色。可能的值为 always
、auto
和 never
。
在备份开始时,需要在源服务器上执行检查点操作。这可能需要一些时间(尤其是在未使用 --checkpoint=fast
选项的情况下),在此期间 pg_basebackup 似乎处于空闲状态。
备份将包括数据目录和表空间中的所有文件,包括配置文件和第三方放置在该目录中的任何其他文件,但 PostgreSQL 管理的某些临时文件和操作系统文件除外。但是,只复制常规文件和目录,但用于表空间的符号链接除外。指向 PostgreSQL 已知的某些目录的符号链接将复制为空目录。其他符号链接和特殊设备文件将被跳过。有关详细信息,请参阅第 53.4 节。
在纯文本格式中,表空间将备份到它们在源服务器上的同一路径,除非使用了选项 --tablespace-mapping
。如果没有此选项,如果在与服务器相同的主机上运行纯文本格式的基本备份,则如果正在使用表空间,将无法正常工作,因为备份必须写入与原始表空间相同的目录位置。
使用 tar 格式时,用户有责任在启动使用数据的 PostgreSQL 服务器之前解压缩每个 tar 文件。如果有其他表空间,则需要将它们的 tar 文件解压缩到正确的位置。在这种情况下,服务器将根据 base.tar
文件中包含的 tablespace_map
文件的内容创建这些表空间的符号链接。
pg_basebackup 可以与相同或更旧的主要版本的服务器一起使用,最低版本为 9.1。但是,WAL 流模式(-X stream
)仅适用于 9.3 及更高版本的服务器,而 tar 格式(--format=tar
)仅适用于 9.5 及更高版本的服务器。
如果源集群上启用了组权限,pg_basebackup 将保留数据文件的组权限。
创建位于 mydbserver
的服务器的基本备份,并将其存储在本地目录 /usr/local/pgsql/data
中
$
pg_basebackup -h mydbserver -D /usr/local/pgsql/data
创建一个本地服务器的备份,每个表空间使用一个压缩的 tar 文件,并将其存储在 backup
目录中,并在运行时显示进度报告
$
pg_basebackup -D backup -Ft -z -P
创建一个单表空间本地数据库的备份,并使用 bzip2 压缩
$
pg_basebackup -D - -Ft -X fetch | bzip2 > backup.tar.bz2
(如果数据库中有多个表空间,此命令将失败。)
要创建本地数据库的备份,其中表空间 /opt/ts
被重新定位到 ./backup/ts
$
pg_basebackup -D backup/data -T /opt/ts=$(pwd)/backup/ts
要创建本地服务器的备份,每个表空间使用一个 tar 文件,并使用 gzip 以 9 级压缩,存储在目录 backup
中
$
pg_basebackup -D backup -Ft --compress=gzip:9
如果您发现文档中任何不正确、与您使用特定功能的体验不符或需要进一步澄清的地方,请使用此表格报告文档问题。