pg_rewind — 将 PostgreSQL 数据目录与另一个从其派生的数据目录同步
pg_rewind
[选项
...] { -D
| --target-pgdata
} 目录
{ --source-pgdata=
| 目录
--source-server=
}connstr
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=connstr
指定用于连接到源 PostgreSQL 服务器的 libpq 连接字符串,以便与目标同步。连接必须是具有足够权限在源服务器上执行 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=文件名
为目标集群使用指定的主服务器配置文件。当 pg_rewind 在此集群上使用内部的 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
指定是否在诊断消息中使用颜色。可能的值有 always
、auto
和 never
。
当使用在线集群作为源执行 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;
基本思路是将源集群的所有文件系统级别的更改复制到目标集群。
扫描目标集群的 WAL 日志,从源集群的时间线历史从目标集群分叉的点之前的最后一个检查点开始。对于每个 WAL 记录,记录每个被触碰的数据块。这将产生一个在源集群分叉后,在目标集群中更改的所有数据块的列表。如果某些 WAL 文件不再可用,请尝试使用 -c
选项重新运行 pg_rewind,以在 WAL 归档中搜索丢失的文件。
使用直接文件系统访问(--source-pgdata
)或 SQL(--source-server
)将所有这些更改的块从源集群复制到目标集群。现在,关系文件处于等同于源和目标 WAL 时间线分歧之前完成的最后一个检查点的状态,再加上源上目标在分歧后发生更改的任何块的当前状态。
将所有其他文件(包括新的关系文件、WAL 段、pg_xact
和配置文件)从源集群复制到目标集群。与基本备份类似,目录 pg_dynshmem/
、pg_notify/
、pg_replslot/
、pg_serial/
、pg_snapshots/
、pg_stat_tmp/
和 pg_subtrans/
的内容将从源集群复制的数据中省略。backup_label
、tablespace_map
、pg_internal.init
、postmaster.opts
、postmaster.pid
和 .DS_Store
文件以及任何以 pgsql_tmp
开头的文件或目录都将被省略。
创建一个 backup_label
文件,以便在故障转移时创建的检查点处开始 WAL 回放,并使用在从活动源倒回时的 pg_current_wal_insert_lsn()
结果或从停止的源倒回时的最后一个检查点 LSN 定义的最小一致性 LSN 来配置 pg_control
文件。
启动目标时,PostgreSQL 会回放所有必需的 WAL,从而使数据目录处于一致的状态。
如果您在文档中看到任何不正确的内容、与您对特定功能的体验不符或需要进一步澄清的内容,请使用此表单报告文档问题。