Postgresql 中文操作指南
Synopsis
pg_rewind [ option …] { -D | —target-pgdata } directory { —source-pgdata=_directory _ | _—source-server=_connstr }
Description
在集群的时间线出现分歧后,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 ,但默认情况下它是启用的。
Warning: Failures While Rewinding
如果 pg_rewind 在处理过程中失败,则目标的数据文件夹可能处于无法恢复的状态。在这种情况下,建议采用新的全新备份。
由于 pg_rewind 完全从源中复制配置文件,因此在重新启动目标服务器之前,可能需要更正用于恢复的配置,特别是在目标重新作为源的备用服务器引入时。如果在回滚操作完成后但未配置恢复的情况下重新启动服务器,目标可能再次与主服务器分歧。
如果 pg_rewind 找到无法直接写入的文件,它将立即失败。例如,当源和目标服务器使用相同的只读 SSL 密钥和证书的文件映射时,可能会发生这种情况。如果此类文件存在于目标服务器上,建议在运行 pg_rewind 之前删除它们。在进行回滚后,其中一些文件可能已从源复制,在这种情况下,可能需要删除复制的数据并恢复回滚之前使用的链接集。
Options
pg_rewind 接受以下命令行参数:
-
-D _directory—target-pgdata=_directory
-
此选项指定与源同步的目标数据目录。在运行 pg_rewind 之前,必须干净地关闭目标服务器。
-
-
—source-pgdata=_directory_
-
指定要与目标同步的源服务器数据目录的文件系统路径。此选项要求干净地关闭源服务器。
-
-
—source-server=_connstr_
-
指定一个 libpq 连接字符串,以连接到要与目标同步的源 PostgreSQL 服务器。该连接必须是正常的(非复制)连接,其中的角色拥有足够的权限来在源服务器上执行 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=_filename_
-
使用为目标集群指定的服务器主配置文件。当在内部使用 postgres 命令对该集群进行回滚操作(使用 -c/--restore-target-wal 选项检索 restore_command 以及强制完成故障恢复时)时,此设置会影响 pg_rewind。
-
-
—debug
-
打印详细调试输出,该输出主要对调试 pg_rewind 的开发者有用。
-
-
—no-ensure-shutdown
-
在 pg_rewind 之前必须干净关闭目标服务器。默认情况下,如果目标服务器未干净关闭,pg_rewind 会在单用户模式下启动目标服务器以先完成意外恢复,然后停止目标服务器。通过传递此选项,pg_rewind 会跳过此步骤,在服务器未干净关闭时立即出错。在这种情况下,用户应自己处理情况。
-
-
-V_—version_
-
显示版本信息,然后退出。
-
-
-?_—help_
-
Show help, then exit.
-
Environment
使用 —source-server 选项时,pg_rewind 还会使用 libpq 支持的环境变量(请参阅 Section 34.15 )。
环境变量 PG_COLOR 指定是否在诊断消息中使用颜色。可能的值是 always 、 auto 和 never 。
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;