## 皮克\_倒带 皮克\_rewind — 将 PostgreSQL 数据目录与从它派生的另一个数据目录同步 ## 概要 `pg_rewind` [*`选项`*...] { `-D` \| `--target-pgdata` }*`目录`* { `--source-pgdata=*`目录`*` \| `--源服务器=*`connstr`*` } ## 描述 皮克\_rewind 是一个工具,用于在集群的时间线发生分歧后,将 PostgreSQL 集群与同一集群的另一个副本同步。一个典型的场景是在故障转移后让旧的主服务器重新联机,作为新主服务器之后的备用服务器。 成功倒带后,目标数据目录的状态类似于源数据目录的基本备份。与进行新的基本备份或使用 rsync、pg 等工具不同\_rewind 不需要比较或复制集群中未更改的关系块。仅复制现有关系文件中更改的块;所有其他文件,包括新的关系文件、配置文件和 WAL 段,都被完整复制。因此,当数据库很大并且集群之间只有一小部分块不同时,倒带操作比其他方法快得多。 皮克\_rewind 检查源集群和目标集群的时间线历史以确定它们分歧的点,并期望在目标集群的`pg_wal`目录一直到达分歧点。可以在目标时间线、源时间线或它们的共同祖先上找到分歧点。在目标集群在分歧后很快关闭的典型故障转移场景中,这不是问题,但如果目标集群在分歧后运行很长时间,其旧的 WAL 文件可能不再存在。在这种情况下,您可以手动将它们从 WAL 存档复制到`pg_wal`目录,或运行 pg\_倒带`-c`自动从 WAL 存档中检索它们的选项。pg的使用\_rewind 不限于故障转移,例如,可以升级备用服务器,运行一些写入事务,然后重新启动以再次成为备用服务器。 运行 pg 后\_rewind,需要完成 WAL 重放才能使数据目录处于一致状态。当目标服务器再次启动时,它将进入归档恢复并重播从分歧点之前的最后一个检查点在源服务器中生成的所有 WAL。如果 pg 时源服务器中的某些 WAL 不再可用\_rewind 已运行,因此 pg 无法复制\_回退会话,它必须在目标服务器启动时可用。这可以通过创建一个`恢复信号`文件在目标数据目录中,并通过配置一个合适的[恢复\_命令](runtime-config-wal.html#GUC-RESTORE-COMMAND)在`postgresql.conf`. 皮克\_rewind 要求目标服务器具有[沃尔\_日志\_提示](runtime-config-wal.html#GUC-WAL-LOG-HINTS)选项启用`postgresql.conf`或在使用 initdb 初始化集群时启用数据校验和。默认情况下,这些都不是当前打开的。[满的\_页\_写](runtime-config-wal.html#GUC-FULL-PAGE-WRITES)还必须设置为`在`, 但默认启用。 ### 警告 如果 pg\_处理时回退失败,则目标的数据文件夹可能不在可以恢复的状态。在这种情况下,建议进行新的全新备份。 作为 pg_rewind 完全从源复制配置文件,可能需要在重新启动目标服务器之前更正用于恢复的配置,特别是如果重新引入目标作为源的备用服务器。如果在倒带操作完成后重新启动服务器但未配置恢复,则目标可能再次与主服务器不同。 皮克\_如果发现无法直接写入的文件,rewind 将立即失败。例如,当源服务器和目标服务器对只读 SSL 密钥和证书使用相同的文件映射时,就会发生这种情况。如果目标服务器上存在此类文件,建议在运行 pg 之前将其删除\_倒带。倒带后,其中一些文件可能已从源复制,在这种情况下,可能需要删除复制的数据并恢复回倒带前使用的链接集。 ## 选项 皮克\_rewind 接受以下命令行参数: `-D *`目录`*`\ `--target-pgdata=*`目录`*` 此选项指定与源同步的目标数据目录。在运行 pg 之前必须彻底关闭目标服务器\_倒带 `--source-pgdata=*`目录`*` 指定要与目标同步的源服务器的数据目录的文件系统路径。此选项要求彻底关闭源服务器。 `--源服务器=*`connstr`*` 指定一个 libpq 连接字符串以连接到源 PostgreSQL 服务器以与目标同步。连接必须是正常(非复制)连接,角色具有足够权限来执行 pg 使用的功能\_在源服务器上倒带(有关详细信息,请参阅注释部分)或超级用户角色。此选项要求源服务器正在运行并接受连接。 `-R`\ `--write-recovery-conf` 创建`待机信号`并将连接设置附加到`postgresql.auto.conf`在输出目录中。`--源服务器`此选项是强制性的。 `-n`\ `--空运行` 除了实际修改目标目录之外,执行所有操作。 `-N`\ `--不同步` 默认,`pg_rewind`将等待所有文件安全地写入磁盘。此选项导致`pg_rewind`无需等待即可返回,这样更快,但意味着随后的操作系统崩溃可能会使同步的数据目录损坏。通常,此选项对测试很有用,但不应在生产安装中使用。 `-P`\ `- 进步` 启用进度报告。启用此功能将在从源集群复制数据时提供大致的进度报告。 `-c`\ `--restore-target-wal` 采用`恢复命令`如果这些文件在目标集群配置中不再可用,则在目标集群配置中定义以从 WAL 存档中检索 WAL 文件`pg_wal`目录。 `--调试` 打印对调试 pg 的开发人员最有用的详细调试输出\_倒带。 `--no-ensure-shutdown` 皮克\_倒带要求在倒带之前彻底关闭目标服务器。默认情况下,如果目标服务器没有干净地关闭,pg_rewind 以单用户模式启动目标服务器首先完成崩溃恢复,然后停止它。通过传递这个选项,pg\_如果服务器没有完全关闭,rewind 会跳过这个并立即出错。在这种情况下,用户应自行处理这种情况。 `-V`\ `- 版本` 显示版本信息,然后退出。 `-?`\ `- 帮助` 显示帮助,然后退出。 ## 环境 什么时候`--源服务器`使用选项,pg_rewind 还使用 libpq 支持的环境变量(参见[第 34.15 节](libpq-envars.html))。 环境变量`PG_COLOR`指定是否在诊断消息中使用颜色。可能的值为`总是`,`汽车`和`绝不`. ## 笔记 执行 pg 时\_rewind 使用在线集群作为源,具有足够权限执行 pg 使用的功能的角色\_可以使用源集群上的倒带代替超级用户。下面是如何创建这样一个角色,命名为`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; ``` 执行 pg 时\_使用最近推广的在线集群作为源进行倒带,需要执行`检查点`升级后,使其控制文件反映最新的时间线信息,由 pg 使用\_rewind 检查目标集群是否可以使用指定的源集群进行倒带。 ### 这个怎么运作 基本思想是将所有文件系统级别的更改从源集群复制到目标集群: 1. 扫描目标集群的 WAL 日志,从源集群的时间线历史从目标集群分叉的点之前的最后一个检查点开始。对于每个 WAL 记录,记录每个被触摸的数据块。在源集群分叉后,这将生成目标集群中更改的所有数据块的列表。如果某些 WAL 文件不再可用,请尝试重新运行 pg\_倒带`-c`用于在 WAL 存档中搜索丢失文件的选项。 2. 将所有这些更改的块从源集群复制到目标集群,或者使用直接文件系统访问(`--source-pgdata`) 或 SQL (`--源服务器`)。关系文件现在的状态相当于源和目标的 WAL 时间线分歧点之前最后完成的检查点的时刻加上分歧后目标上任何块更改的源上的当前状态。 3. 复制所有其他文件,包括新的关系文件、WAL 段、`pg_xact`,以及从源集群到目标集群的配置文件。与基本备份类似,目录的内容`pg_dynshmem/`,`pg_notify/`,`pg_replslot/`,`pg_serial/`,`pg_snapshots/`,`pg_stat_tmp/`, 和`pg_subtrans/`从源集群复制的数据中省略。文件`备份标签`,`表空间映射`,`pg_internal.init`,`postmaster.opts`, 和`邮递员.pid`,以及任何以开头的文件或目录`pgsql_tmp`, 被省略。 4. 创建一个`备份标签`文件以在故障转移时创建的检查点开始 WAL 重播并配置`pg_control`具有最小一致性 LSN 的文件定义为`pg_current_wal_insert_lsn()`从活动源倒带时或从停止的源倒带时的最后一个检查点 LSN。 5. 启动目标时,PostgreSQL 会重放所有需要的 WAL,从而使数据目录处于一致状态。