pg_rewind [option...] {-D | --target-pgdata} directory {--source-pgdata=directory | --source-server=connstr}
pg_rewind是一个工具,用于在集群的时间轴发散后, 将PostgreSQL集群与同一集群的另一个副本同步。 典型的方案是在故障转移后使旧主服务器重新联机,作为跟随新主服务器的备用服务器。
结果等效于用源代码替换目标数据目录。复制所有文件,包括配置文件。 pg_rewind在进行新的基本备份或者像rsync 之类的工具方面的优点是,pg_rewind不需要读取集群中所有未更改的文件。 这使得它在数据库很大时更快,并且只有一小部分在集群之间不同。
pg_rewind检查源和目标集群的时间线历史,以确定它们发散的点, 并且期望在目标集群的pg_xlog目录中找到WAL,一直到达分歧点。 在典型的故障切换情况下,目标集群在分歧后很快关闭,这不是问题, 但如果目标集群在分歧后运行了很长时间,旧的WAL文件可能不再存在。 在这种情况下,可以将它们从WAL归档手动复制到pg_xlog目录。 目前不支持自动从WAL档案中获取缺少的文件。
当目标服务器在运行pg_rewind之后第一次启动时, 它将进入恢复模式,并在发散点之后重放源服务器中生成的所有WAL。 如果在pg_rewind运行时,源服务器中的某些WAL不再可用, 因此无法通过pg_rewind会话复制,则需要在目标服务器启动时可用。 这可以通过使用合适的restore_command 在目标数据目录中创建一个recovery.conf文件来完成。
pg_rewind要求目标服务器在postgresql.conf 中启用wal_log_hints选项,或者在使用initdb 初始化集群时启用数据校验和。默认情况下,这两个都不是当前启用的。 full_page_writes也必须启用。这是默认值。
pg_rewind接受下列命令行参数:
此选项指定与源同步的目标数据目录。目标服务器必须在运行 pg_rewind之前完全关闭。
指定源服务器的数据目录的路径,以便与目标服务器同步。 当使用--source-pgdata时,源服务器必须完全关闭。
指定一个libpq连接字符串以连接到源PostgreSQL 服务器以与目标同步。连接必须是具有超级用户访问权限的正常(非复制)连接。 服务器必须已启动并正在运行,且不能处于恢复模式。
除了实际修改目标目录外,执行所有操作。
启用进度报告。打开此选项将在从源群集复制数据时提供大致的进度报告。
打印详细调试输出,对于调试pg_rewind的开发人员来说非常有用。
显示版本信息,然后退出。
显示帮助,然后退出。
基本思想是将所有从新集群复制到旧集群,除了我们知道的那些相同的块。
扫描旧集群的WAL日志,从新集群的时间线历史记录从旧集群分出的点之前的最后一个检查点开始。 对于每个WAL记录,记下被触及的数据块。 这将产生在新群集分叉之后在旧群集中更改的所有数据块的列表。
将所有更改的块从新集群复制到旧集群。
将所有其他文件(如clog和配置文件) 从新集群复制到旧集群,除关系文件外的所有内容。
从在故障切换时创建的检查点开始,从新集群应用WAL。 (严格地说, pg_rewind不应用WAL, 它只是创建一个备份标签文件,指示当PostgreSQL启动时, 它将从该检查点开始重放,并应用所有需要的WAL。)