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 会话复制,则必须在启动目标服务器时使其可用。这可以通过在目标数据目录中创建一个 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=连接字符串
指定用于连接到源 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,从而使数据目录处于一致的状态。
如果您在文档中看到任何不正确、与您特定功能的使用体验不符或需要进一步澄清的内容,请使用此表单报告文档问题。