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

pg_rewind

pg_rewind — 将 PostgreSQL 数据目录与从中派生的另一个数据目录同步

概要

pg_rewind [选项...] { -D | --target-pgdata } 目录 { --source-pgdata=目录 | --source-server=连接字符串 }

描述

pg_rewind 是一种用于在集群的时间线发生分歧后,将 PostgreSQL 集群与同一集群的另一个副本同步的工具。一个典型的场景是在故障转移后将旧的主服务器重新上线,作为跟随新主服务器的备用服务器。

在成功回滚后,目标数据目录的状态类似于源数据目录的基础备份。与执行新的基础备份或使用 rsync 等工具不同,pg_rewind 不需要比较或复制集群中未更改的关系块。仅复制现有关系文件中更改的块;所有其他文件,包括新的关系文件、配置文件和 WAL 段,都将完整复制。因此,当数据库很大并且集群之间只有一小部分块不同时,回滚操作比其他方法快得多。

pg_rewind 检查源集群和目标集群的时间线历史记录以确定它们分歧的点,并期望在目标集群的 pg_wal 目录中找到一直回溯到分歧点的 WAL。分歧点可以在目标时间线、源时间线或它们的共同祖先上找到。在目标集群在分歧后不久就关闭的典型故障转移场景中,这不是问题,但如果目标集群在分歧后运行了很长时间,则其旧的 WAL 文件可能不再存在。在这种情况下,您可以手动将它们从 WAL 归档复制到 pg_wal 目录,或使用 -c 选项运行 pg_rewind 以自动从 WAL 归档中检索它们。pg_rewind 的使用不限于故障转移,例如,备用服务器可以被提升,执行一些写入事务,然后回滚以再次成为备用服务器。

运行 pg_rewind 后,需要完成 WAL 重放才能使数据目录处于一致状态。当目标服务器再次启动时,它将进入归档恢复并重放从分歧点之前的最后一个检查点开始在源服务器中生成的全部 WAL。如果在运行 pg_rewind 时源服务器中的一些 WAL 不再可用,因此无法由 pg_rewind 会话复制,则必须在启动目标服务器时提供这些 WAL。这可以通过在目标数据目录中创建 recovery.signal 文件并在 postgresql.conf 中配置合适的 restore_command 来完成。

pg_rewind 要求目标服务器在 postgresql.conf 中启用 wal_log_hints 选项,或者在使用 initdb 初始化集群时启用数据校验和。这些目前默认都不启用。还必须将 full_page_writes 设置为 on,但默认情况下已启用。

警告:回滚期间的故障

如果 pg_rewind 在处理过程中失败,则目标的数据文件夹可能处于无法恢复的状态。在这种情况下,建议执行新的完整备份。

由于 pg_rewind 完全从源复制配置文件,因此在重新启动目标服务器之前可能需要更正用于恢复的配置,尤其是在将目标重新引入为源的备用服务器时。如果在回滚操作完成后但未配置恢复的情况下重新启动服务器,则目标可能会再次与主服务器发生分歧。

pg_rewind 如果发现无法直接写入的文件,则会立即失败。例如,当源服务器和目标服务器对只读 SSL 密钥和证书使用相同的文件映射时,就会发生这种情况。如果目标服务器上存在此类文件,建议在运行 pg_rewind 之前将其删除。完成回滚后,其中一些文件可能已从源复制,在这种情况下,可能需要删除复制的数据并恢复回滚之前使用的链接集。

选项

pg_rewind 接受以下命令行参数

-D 目录
--target-pgdata=目录

此选项指定与源同步的目标数据目录。在运行 pg_rewind 之前,必须干净地关闭目标服务器。

--source-pgdata=目录

指定源服务器数据目录的文件系统路径,以将其与目标同步。此选项要求源服务器已干净地关闭。

--source-server=连接字符串

指定一个 libpq 连接字符串,以连接到源 PostgreSQL 服务器以将其与目标同步。连接必须是正常的(非复制)连接,并且角色具有足够的权限在源服务器上执行 pg_rewind 使用的函数(有关详细信息,请参阅“注释”部分)或超级用户角色。此选项要求源服务器正在运行并接受连接。

-R
--write-recovery-conf

在输出目录中创建 standby.signal 并将连接设置追加到 postgresql.auto.conf。此选项必须使用 --source-server

-n
--dry-run

执行所有操作,但实际上不修改目标目录。

-N
--no-sync

默认情况下,pg_rewind 将等待所有文件安全地写入磁盘。此选项会导致 pg_rewind 返回而无需等待,这更快,但意味着随后的操作系统崩溃可能会导致数据目录损坏。通常,此选项适用于测试,但不应在生产安装中使用。

-P
--progress

启用进度报告。启用此选项将在从源集群复制数据时提供近似的进度报告。

-c
--restore-target-wal

如果这些文件不再存在于 pg_wal 目录中,则使用目标集群配置中定义的 restore_command 从 WAL 归档中检索 WAL 文件。

--config-file=文件名

对目标集群使用指定的主服务器配置文件。当它在内部使用 postgres 命令对该集群执行回滚操作时(使用选项 -c/--restore-target-wal 检索 restore_command 以及强制完成崩溃恢复时),这会影响 pg_rewind

--debug

打印详细的调试输出,这主要对调试 pg_rewind 的开发人员有用。

--no-ensure-shutdown

pg_rewind 要求在回滚之前干净地关闭目标服务器。默认情况下,如果目标服务器未干净地关闭,pg_rewind 会以单用户模式启动目标服务器以首先完成崩溃恢复,然后停止它。通过传递此选项,pg_rewind 将跳过此操作,并在服务器未干净地关闭时立即出错。在这种情况下,用户应该自己处理这种情况。

--sync-method=方法

当设置为 fsync(默认值)时,pg_rewind 将递归打开和同步数据目录中的所有文件。文件搜索将遵循 WAL 目录和每个配置的表空间的符号链接。

在 Linux 上,可以使用 syncfs 来要求操作系统同步包含数据目录、WAL 文件和每个表空间的整个文件系统。有关使用 syncfs 时需要注意的事项,请参阅 recovery_init_sync_method

当使用 --no-sync 时,此选项无效。

-V
--version

显示版本信息,然后退出。

-?
--help

显示帮助信息,然后退出。

环境

当使用 --source-server 选项时,pg_rewind 还使用 libpq 支持的环境变量(请参阅 第 32.15 节)。

环境变量 PG_COLOR 指定是否在诊断消息中使用颜色。可能的值为 alwaysautonever

注释

当使用在线集群作为源执行 pg_rewind 时,可以使用具有足够权限在源集群上执行 pg_rewind 使用的函数的角色,而不是超级用户。以下是如何创建此类角色,此处命名为 rewind_user

CREATE USER rewind_user LOGIN;
GRANT EXECUTE ON function pg_catalog.pg_ls_dir(text, boolean, boolean) TO rewind_user;
GRANT EXECUTE ON function pg_catalog.pg_stat_file(text, boolean) TO rewind_user;
GRANT EXECUTE ON function pg_catalog.pg_read_binary_file(text) TO rewind_user;
GRANT EXECUTE ON function pg_catalog.pg_read_binary_file(text, bigint, bigint, boolean) TO rewind_user;

工作原理

基本思想是从源集群复制所有文件系统级更改到目标集群。

  1. 扫描目标集群的 WAL 日志,从源集群的时间线历史记录从目标集群分叉之前的最后一个检查点开始。对于每个 WAL 记录,记录每个被触及的数据块。这将产生目标集群在源集群分叉后更改的所有数据块的列表。如果某些 WAL 文件不再可用,请尝试使用 -c 选项重新运行 pg_rewind 以在 WAL 归档中搜索丢失的文件。

  2. 将源集群中所有已更改的数据块复制到目标集群,可以使用直接文件系统访问(--source-pgdata)或 SQL(--source-server)方法。关系文件现在处于与源和目标WAL时间线发生分歧之前的最后一个已完成检查点时刻等效的状态,再加上该分歧后目标上发生更改的任何块在源上的当前状态。

  3. 复制所有其他文件,包括新的关系文件、WAL段、pg_xact和配置文件,从源集群到目标集群。与基本备份类似,目录pg_dynshmem/pg_notify/pg_replslot/pg_serial/pg_snapshots/pg_stat_tmp/pg_subtrans/的内容不包含在从源集群复制的数据中。文件backup_labeltablespace_mappg_internal.initpostmaster.optspostmaster.pid.DS_Store以及任何以pgsql_tmp开头的文件或目录都被省略。

  4. 创建一个backup_label文件,以便在故障切换时创建的检查点处开始WAL回放,并使用最小一致性LSN配置pg_control文件,该LSN定义为从活动源回退时pg_current_wal_insert_lsn()的结果,或从停止的源回退时最后一个检查点的LSN。

  5. 启动目标时,PostgreSQL会回放所有必需的WAL,从而使数据目录处于一致状态。

提交更正

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