↑↓ 选择↵ 打开⌫ 切换范围完整搜索

PG.CENTER 连接 PostgreSQL 文档、百科与生态知识。由 Pigsty 维护。

支持中的版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发中的版本: 19 / 20devel
已结束支持的版本: 13 / 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1

pg_basebackup

pg_basebackup — 获取 PostgreSQL 集簇的基础备份

大纲

pg_basebackup [option...]

描述

pg_basebackup 用于获取正在运行的 PostgreSQL 数据库集簇的基础备份。备份过程不会影响数据库的其他客户端,并且该备份既可用于时间点恢复(见第 26.3 节),也可用作日志传送或流复制备库的起点(见第 27.2 节)。

pg_basebackup 会精确复制数据库集簇的文件,同时确保服务器自动进入和退出备份模式。备份始终针对整个数据库集簇;不可能只备份单个数据库或数据库对象。对于选择性备份,必须使用诸如 pg_dump 之类的其他工具。

备份是通过一个使用复制协议的常规 PostgreSQL 连接进行的。建立该连接所使用的用户 ID 必须具有 REPLICATION 权限(见第 22.2 节),或者是超级用户,并且 pg_hba.conf 必须允许该复制连接。服务器还必须将 max_wal_senders 设置得足够高,以便至少提供一个用于备份的 WAL 发送进程,并在使用 WAL 流式传输时再提供一个 WAL 发送进程。

可以同时运行多个 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_compresslog 之类的工具用作 archive_command,从 WAL 文件中移除整页写入。

每当 pg_basebackup 执行基础备份时,服务器的 pg_stat_progress_basebackup 视图都会报告备份进度。详见第 28.4.5 节。

选项

以下命令行选项控制输出的位置和格式:

-D directory
--pgdata=directory #

设置写入输出的目标目录。如果该目录不存在,pg_basebackup 会创建它(以及所有缺失的父目录)。如果该目录已经存在,则必须为空。

当备份采用 tar 格式时,目标目录可以指定为-(短横线),从而将 tar 文件写到 stdout。

此选项是必需的。

-F format
--format=format #

选择输出格式。format 可以是以下值之一:

p
plain #

将输出写为普通文件,其布局与源服务器的数据目录和表空间相同。当集簇没有额外表空间时,整个数据库都会放在目标目录中。如果集簇包含额外表空间,则主数据目录会放在目标目录中,而其他所有表空间都会放在与源服务器上相同的绝对路径中。(如需改变这一点,见 --tablespace-mapping。)

这是默认格式。

t
tar #

将输出写为目标目录中的 tar 文件。主数据目录的内容会写入名为 base.tar 的文件中,而每个其他表空间都会写入一个以该表空间 OID 命名的独立 tar 文件中。

如果目标目录指定为-(短横线),tar 内容将写入标准输出,适合通过管道传给例如 gzip。只有当集簇没有额外表空间且未使用 WAL 流式传输时,才允许这样做。

-R
--write-recovery-conf #

创建 standby.signal 文件,并将连接设置追加到目标目录中的 postgresql.auto.conf 文件中(如果使用 tar 格式,则追加到基础归档文件内)。这样可以更方便地利用备份结果搭建备库。

postgresql.auto.conf 文件会记录 pg_basebackup 所用的连接设置,以及复制槽(如果指定了),以便流复制以后使用相同的设置。

-T olddir=newdir
--tablespace-mapping=olddir=newdir #

在备份期间,将目录 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 格式时可用,并且所有 tar 文件名都会自动添加.gz 后缀。

-Z level
--compress=level #

启用 tar 文件输出的 gzip 压缩,并指定压缩级别(0 到 9,其中 0 表示不压缩,9 表示最佳压缩)。压缩仅在使用 tar 格式时可用,并且所有 tar 文件名都会自动添加.gz 后缀。

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

-c fast|spread
--checkpoint=fast|spread #

将检查点模式设置为 fast(立即)或 spread(默认)(见第 26.3.3 节)。

-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 流式传输。

-v
--verbose #

启用详细模式。它会在启动和关闭过程中输出一些额外步骤;如果同时启用了进度报告,还会显示当前正在处理的确切文件名。

--manifest-checksums=algorithm #

指定应用到备份清单中每个文件的校验和算法。目前可用的算法有 NONE、CRC32C、SHA224、SHA256、SHA384 和 SHA512。默认值为 CRC32C。

如果选择 NONE,备份清单将不包含任何校验和。否则,它将包含使用指定算法为备份中每个文件计算的校验和。此外,清单始终会包含其自身内容的 SHA256 校验和。SHA 算法明显比 CRC32C 更耗费 CPU,因此选择其中一种可能会增加完成备份所需的时间。

对于希望验证备份未被篡改的用户,使用 SHA hash 函数可以为每个文件提供具有密码学安全性的摘要;而 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 #

防止为备份创建临时复制槽。

默认情况下,如果选择了 WAL 流式传输,但没有使用 -S 选项给出槽名,那么会创建一个临时复制槽(如果源服务器支持)。

此选项的主要目的是在服务器没有空闲复制槽时,仍然允许执行基础备份。几乎总是首选使用复制槽,因为它能防止服务器在备份期间移除所需的 WAL。

--no-verify-checksums #

如果获取基础备份的服务器启用了校验和,则禁用对这些校验和的验证。

默认情况下,会验证校验和;校验和验证失败将导致非零退出状态。不过,在这种情况下,基础备份不会被删除,就像使用了 --no-clean 一样。校验和验证失败也会在 pg_stat_database 视图中报告。

以下命令行选项控制到源服务器的连接:

-d connstr
--dbname=connstr #

以连接字符串的形式指定用于连接服务器的参数;这些参数会覆盖任何相互冲突的命令行选项。

出于与其他客户端应用保持一致的考虑,此选项名为 --dbname;但由于 pg_basebackup 并不连接到集簇中的某个特定数据库,连接字符串中的任何数据库名都会被忽略。

-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 支持的环境变量(见第 34.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

报告文档问题

阅读 上游文档. 通过 PostgreSQL 文档反馈表单.