Warning

pg_rewind

pg_rewind —同步一个 PostgreSQL 数据目录和从它派生的另一个数据目录

Synopsis

pg_rewind [ option ...] { -D | --target-pgdata } directory { --source-pgdata=directory | --source-server=connstr }

Description

pg_rewind 是一个工具,用于在群集的时间线发生分歧之后,将 PostgreSQL 群集与同一群集的另一个副本进行同步。典型的情况是在故障转移后将旧的主服务器重新联机,作为新主服务器之后的备用服务器。

结果等同于用源目录替换目标数据目录。仅复制关系文件中已更改的块。所有其他文件(包括配置文件)都将完整复制。与进行新的基本备份或 rsync 之类的工具相比,pg_rewind 的优势在于 pg_rewind 不需要读取集群中未更改的块。当数据库很大并且集群之间的块差异很小时,这可以使速度大大提高。

pg_rewind 检查源集群和目标集群的时间线历史,以确定它们之间的差异点,并期望在目标集群的pg_wal目录中找到 WAL,一直回到差异点。可以在目标时间轴,源时间轴或它们的共同祖先上找到分歧点。在典型的故障转移方案中,目标群集在分支之后不久就关闭了,这不是问题,但是如果目标群集在分支之后运行了很长时间,则旧的 WAL 文件可能不再存在。在这种情况下,可以将它们从 WAL 存档手动复制到pg_wal目录,或者在启动时通过配置recovery.conf来获取它们。 pg_rewind 的使用不限于故障转移,例如可以提升备用服务器,运行一些写事务,然后倒回以再次成为备用服务器。

在运行 pg_rewind 之后首次启动目标服务器时,它将进入恢复模式,并在分歧点之后重播源服务器中生成的所有 WAL。如果运行 pg_rewind 时某些 WAL 在源服务器中不再可用,因此 pg_rewind 会话无法复制,则必须在启动目标服务器时使其可用。这可以通过在目标数据目录中使用合适的restore_command创建一个recovery.conf文件来完成。

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

Warning

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

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

Options

pg_rewind 接受以下命令行参数:

  • -D directory
    --target-pgdata=directory

    • 此选项指定与源同步的目标数据目录。在运行 pg_rewind 之前,必须彻底关闭目标服务器。
  • --source-pgdata=directory

    • 指定与目标服务器同步的源服务器的数据目录的文件系统路径。此选项要求彻底关闭源服务器。
  • --source-server=connstr

    • 指定一个 libpq 连接字符串以连接到源 PostgreSQL 服务器以与其进行同步。该连接必须是普通(非复制)连接,并且该角色具有足够的权限来执行源服务器上 pg_rewind 使用的功能(有关详细信息,请参见“Comments”部分),或者是超级用户角色。此选项要求源服务器正在运行,并且不处于恢复模式。
  • -n
    --dry-run

    • 除了实际修改目标目录外,执行所有其他操作。
  • -P
    --progress

    • 启用进度报告。启用此选项将在从源集群复制数据时提供大致的进度报告。
  • --debug

    • 打印详细的调试输出,对调试 pg_rewind 的开发人员最有用。
  • -V
    --version

    • 显示版本信息,然后退出。
  • -?
    --help

    • 显示帮助,然后退出。

Environment

当使用--source-server选项时,pg_rewind 也使用 libpq 支持的环境变量(参见Section 34.14)。

Notes

当使用在线集群作为源执行 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;

当使用最近升级的在线集群作为源执行 pg_rewind 时,有必要在升级后执行CHECKPOINT,以便其控制文件反映最新的时间轴信息,pg_rewind 使用该信息来检查目标集群是否可以使用指定的源群集倒带。

工作原理

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

  • 从源集群的时间轴历史记录从目标集群派生的点之前的最后一个检查点开始,扫描目标集群的 WAL 日志。对于每个 WAL 记录,记录每个被触摸的数据块。在源集群派生之后,这将生成目标集群中所有已更改数据块的列表。

  • 使用直接文件系统访问(--source-pgdata)或 SQL(--source-server)将所有这些更改的块从源群集复制到目标群集。

  • 将所有其他文件(例如pg_xact)和配置文件从源集群复制到目标集群(关系文件之外的所有文件)。与基本备份类似,从源群集复制的数据中省略了目录pg_dynshmem/pg_notify/pg_replslot/pg_serial/pg_snapshots/pg_stat_tmp/pg_subtrans/的内容。省略以pgsql_tmp开头的任何文件或目录,以及backup_labeltablespace_mappg_internal.initpostmaster.optspostmaster.pid

  • 从故障转移时创建的检查点开始,从源群集应用 WAL。 (严格来说,pg_rewind 不应用 WAL,它只是创建一个备份标签文件,使 PostgreSQL 通过从该检查点开始重放所有 WAL 来启动 PostgreSQL.)