Postgresql 中文操作指南

pg_resetwal

pg_resetwal — 重置 PostgreSQL 数据库集群的预写日志和其他控制信息

Synopsis

pg_resetwal [ -f | —​force ] [ -n | —​dry-run ] [ option …​] datadir

Description

pg_resetwal 清除预写日志 (WAL),并可以选择重置存储在 pg_control 文件中的其他一些控制信息。当这些文件已损坏时,有时需要此函数。仅在服务器由于此类损坏而无法启动时才应将其作为最后手段使用。

在运行此命令后,应该能够启动服务器,但请记住由于部分提交的事务,数据库可能包含不一致的数据。你应该立即转储你的数据,运行 initdb 并还原。还原后,检查不一致之处并根据需要进行修复。

此实用程序只能由安装服务器的用户运行,因为它需要对数据目录进行读/写访问。出于安全原因,你必须在命令行中指定数据目录。 pg_resetwal 不使用环境变量 PGDATA

如果 pg_resetwal 抱怨它无法确定 pg_control 的有效数据,则你可以强制它继续操作,方法是指定 -f (强制)选项。在这种情况下,系统会用合理的数值代替缺失的数据。可以找到大多数字段的匹配项,但是可能需要手动为下一个 OID、下一个事务 ID 和时代、下一个多事务 ID 和偏移量,以及 WAL 启动位置字段提供帮助。可以使用下面讨论的选项设置这些字段。如果你无法确定所有这些字段的正确数值,仍然可以使用 -f ,但是恢复的数据库比平时更加可疑:立即转储和还原是必要的。 Do not 在转储之前执行数据库中的任何数据修改操作,因为任何此类操作都会使损坏情况变得更糟。

Options

  • -f_—​force_

    • 正如上面解释的那样,即使 pg_resetwal 无法确定 pg_control 的有效数据,也强制 pg_resetwal 继续执行。

  • -n_—​dry-run_

    • -n / —​dry-run 选项指示 pg_resetwal 输出从 pg_control 重构的值和准备更改的值,然后不修改任何内容直接退出。这主要是一个调试工具,但可在允许 pg_resetwal 真正继续执行之前用作健全性检查。

  • -V_—​version_

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

  • -?_—​help_

    • Show help, then exit.

仅当 pg_resetwal 无法通过读取 pg_control 确定适当的值时才需要以下选项。可以按照以下步骤确定安全的值。对于使用数字参数的值,可以使用前缀 0x 指定十六进制值。

  • -c _xid,xid—​commit-timestamp-ids=_xid,xid

    • 手动设置可以检索其提交时间的最新和最旧的事务 ID。

    • 可以通过在数据目录下的 pg_commit_ts 目录中查找数字最小值的文件名来确定可以检索其提交时间的最旧事务 ID(第一部分)的安全值。相反,可以通过在同一目录中查找数字最大值的文件名来确定可以检索其提交时间的最新的事务 ID 的安全值(第二部分)。文件名以十六进制表示。

  • -e _xid_epoch—​epoch=_xid_epoch

    • 手动设置下一个事务 ID 的时代。

    • 事务 ID 时代实际上并未存储在数据库中的任何位置,除了由 pg_resetwal 设置的字段之外,因此只要数据库自身相关,任何值都是可行的。你可能需要调整此值以确保复制系统(例如 Slony-I 和 Skytools)正常工作 — 如果是这样,则应该可以从下游复制数据库的状态中获取适当的值。

  • -l _walfile—​next-wal-file=_walfile

    • 在 data 目录中的 pg_wal 文件夹下,通过指定下一个 WAL 分段文件名称手动设置 WAL 开始位置。

    • 下一个 WAL 分段文件的名称应大于当前 data 目录中 pg_wal 下存在的任何WAL 分段文件名称。这些名称也采用十六进制表示方式,且包括三个部分。第一部分是“时间表 ID”,通常应保持不变。例如,如果 00000001000000320000004Apg_wal 中最大的条目,请使用 -l 00000001000000320000004B 或更高版本。

    • 请注意,在使用非默认 WAL 分段大小时,WAL 文件名称中的数字与系统函数和系统视图报告的 LSN 不同。此选项使用 WAL 文件名称,而不使用 LSN。

  • -m _mxid,mxid—​multixact-ids=_mxid,mxid

    • 手动设置下一个和最旧的多事务 ID。

    • 可以通过在 data 目录下的 pg_multixact/offsets 文件夹中查找数字最大的文件名、加 1,然后乘以 65536 (0x10000),确定下一个多事务 ID(第一部分)的安全值。相反,可以通过在同一文件夹中查找数字最小的文件名并乘以 65536,确定最旧多事务 ID( -m 的第二部分)的安全值。文件名称采用十六进制表示方式,因此执行此操作的最简单方法是用十六进制指定选项值并附加四个零。

  • -o _oid—​next-oid=_oid

    • 手动设置下一个 OID。

    • 没有可比性的方法可以确定超出数据库中最大 OID 的下一个 OID,但幸运的是,获取正确的下一个 OID 设置至关重要。

  • -O _mxoff—​multixact-offset=_mxoff

    • 手动设置下一个多事务偏移量。

    • 可以通过在 data 目录下的 pg_multixact/members 文件夹中查找数字最大的文件名、加 1,然后乘以 52352 (0xCC80),确定安全值。文件名称采用十六进制表示方式。没有像其他追加零选项那样的简单方法。

  • —​wal-segsize=_wal_segment_size_

    • 设置新的 WAL 分段大小(以 MB 为单位)。该值必须设置为 1 到 1024(MB)之间的 2 的幂。请参阅 initdb 的相同选项以了解更多信息。

  • -u _xid—​oldest-transaction-id=_xid

    • 手动设置最旧未冻结事务 ID。

    • 可以通过在 data 目录下的 pg_xact 文件夹中查找数字最小的文件名,然后乘以 1048576 (0x100000),确定安全值。请注意,文件名称采用十六进制表示方式。通常也最容易以十六进制形式指定选项值。例如,如果 0007pg_xact 中最小的条目,则 -u 0x700000 将起作用(五个尾随零提供正确的乘数)。

  • -x _xid—​next-transaction-id=_xid

    • 手动设置下一个事务 ID。

    • 可以通过在 data 目录下的 pg_xact 文件夹中查找数字最大的文件名、加 1,然后乘以 1048576 (0x100000),确定安全值。请注意,文件名称采用十六进制表示方式。通常也最容易以十六进制形式指定选项值。例如,如果 0011pg_xact 中最大的条目,则 -x 0x1200000 将起作用(五个尾随零提供正确的乘数)。

Note

pg_resetwal 本身会查找 pg_wal 中的文件,并选择超出最后一个现有文件的文件名的默认 -l 设置。因此,只有在你了解目前在 pg_wal 中不存在的 WAL 分段文件(例如脱机存档中的条目)或 pg_wal 的内容已完全丢失时,才需要手动调整 -l

Note

虽然 pg_resetwal 会将 WAL 开始地址设置为超出最新存在的 WAL 分段文件,但某些分段大小更改可能会导致以前 WAL 文件名称重复使用。建议将 -l 与此选项结合使用,以手动设置 WAL 开始地址(如果 WAL 文件名称重叠会导致存档策略出现问题)。

Environment

  • PG_COLOR

    • 指定是否在诊断消息中使用颜色。可能的值为 alwaysautonever

Notes

当服务器正在运行时,不可使用此命令。如果在 data 目录中找到服务器锁定文件, pg_resetwal 将拒绝启动。如果服务器崩溃,则可能遗留了一个锁定文件;在这种情况下,你可以删除锁定文件以允许 pg_resetwal 运行。但在此之前,要确保没有服务器进程仍在运行。

pg_resetwal 仅适用于同一主版本服务器。

See Also