2024年9月26日: PostgreSQL 17 发布!
支持的版本:当前 (17) / 16 / 15 / 14 / 13 / 12
开发版本:devel
不受支持的版本:11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1

pg_basebackup

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 权限的用户 ID 建立(请参见 第 21.2 节)或为超级用户,并且 pg_hba.conf 必须允许复制连接。服务器还必须配置为将 max_wal_senders 设置得足够高,以便为备份提供至少一个 walsender 以及一个用于 WAL 流式传输(如果使用)的 walsender。

可以同时运行多个 pg_basebackup,但从性能的角度来看,通常最好只进行一次备份,然后复制结果。

pg_basebackup 不仅可以从主服务器获取基本备份,还可以从备用服务器获取。要从备用服务器获取备份,请设置备用服务器以便它可以接受复制连接(即,设置 max_wal_sendershot_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 的文件,每个其他表空间将写入以该表空间的 OID 命名为的单独 tar 文件。

如果目标目录指定为 -(短横线),则 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=旧目录=新目录

在备份期间将目录 旧目录 中的表空间重新定位到 新目录。要生效,旧目录 必须与表空间在其上定义的源服务器上的路径规范完全匹配。(但如果源服务器上的 旧目录 中没有表空间,则不会出错。)同时,新目录 是接收主机文件系统中的一个目录。与主目标目录一样,新目录 无需事先存在,但如果它已存在,则它必须为空。 旧目录新目录 都必须是绝对路径。如果任一路径需要包含等号 (=),则在其前面加上反斜杠。此选项可以为多个表空间指定多次。

如果以这种方式重新定位了表空间,则主数据目录内的符号链接将更新为指向新位置。因此,新数据目录已准备好用于具有所有表空间更新位置的新服务器实例。

目前,此选项仅适用于普通输出格式;如果选择了 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]

请求备份压缩。如果包含 clientserver,则指定在何处执行压缩。在服务器上压缩将减少传输带宽,但会增加服务器 CPU 消耗。默认值为 client,除非使用 --target。在这种情况下,备份不会发送到客户端,因此只有服务器压缩才是明智的。当使用 -Xstream(默认值)时,不会将服务器端压缩应用于 WAL。要压缩 WAL,请使用客户端压缩,或指定 -Xfetch

压缩方法可以设置为 gziplz4zstdnone(不压缩)或整数(如果为 0 则不压缩,如果大于 0 则为 gzip)。可以选择指定压缩详细信息字符串。如果详细信息字符串是整数,则指定压缩级别。否则,它应该是逗号分隔的项目列表,每个项目都采用 keywordkeyword=value 的形式。目前,支持的关键字是 levellongworkers。当压缩方法指定为普通整数时,不能使用详细信息字符串。

如果未指定压缩级别,则将使用默认压缩级别。如果仅指定了级别而未提及算法,则如果级别大于 0,则将使用 gzip 压缩,如果级别为 0,则不使用压缩。

当 tar 格式与 gziplz4zstd 一起使用时,后缀 .gz.lz4.zst 将分别自动添加到所有 tar 文件名中。当使用纯格式时,可能不会指定客户端压缩,但仍然可以请求服务器端压缩。如果这样做,服务器将压缩备份以进行传输,客户端将解压缩并提取它。

当此选项与 -Xstream 结合使用时,如果选择了客户端 gzip 压缩,则 pg_wal.tar 将使用 gzip 压缩,但如果选择了任何其他压缩算法或选择了服务器端压缩,则不会压缩。

以下命令行选项控制备份的生成和程序的调用

-c {fast|spread}
--checkpoint={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=algorithm

指定应应用于备份清单中包含的每个文件的校验和算法。目前,可用的算法有 NONECRC32CSHA224SHA256SHA384SHA512。默认值为 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 不会连接到集群中的任何特定数据库,因此连接字符串中的任何数据库名称都将被 PostgreSQL 忽略。但是,用于连接到 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 环境变量指定是否在诊断消息中使用颜色。可能的值为 alwaysautonever

备注

在备份开始时,需要在源服务器上执行检查点。这可能需要一些时间(尤其是在未使用 --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

要创建本地服务器的备份,每个表空间一个使用 gzip 压缩级别 9 的 tar 文件,存储在 backup 目录中

$ pg_basebackup -D backup -Ft --compress=gzip:9

另请参阅

pg_dump第 27.4.6 节

提交更正

如果您在文档中看到任何不正确的内容、与您对特定功能的体验不符的内容或需要进一步澄清的内容,请使用 此表单 报告文档问题。