2024 年 9 月 26 日: PostgreSQL 17 发布!
支持版本:当前 (17) / 16 / 15 / 14 / 13 / 12
开发版本:devel
不支持的版本:11 / 10

pg_resetwal

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

概要

pg_resetwal [ -f | --force ] [ -n | --dry-run ] [选项...] [ -D | --pgdata ]数据目录

描述

pg_resetwal 清除预写日志(WAL)并选择性地重置存储在 pg_control 文件中的一些其他控制信息。如果这些文件已损坏,则有时需要使用此功能。它应该仅作为最后的手段使用,当服务器因这种损坏而无法启动时。

某些选项,例如 --wal-segsize(见下文),也可以用于修改数据库集群的某些全局设置,而无需重新运行 initdb。如果未使用下面提到的任何危险模式,则可以在其他情况下正常的数据库集群上安全地执行此操作。

如果 pg_resetwal 在服务器已干净关闭且控制文件完好无损的数据目录上使用,则它对数据库系统的内容不会有任何影响,除了不再使用的 WAL 文件会被清除之外。任何其他使用都可能很危险,必须非常小心地进行。 pg_resetwal 将要求在开始处理处于非正常关闭状态或控制文件已损坏的数据目录之前指定 -f(强制)选项。

在对具有损坏 WAL 或损坏控制文件的数据目录运行此命令后,应该可以启动服务器,但请记住,数据库可能包含不一致的数据,因为事务是部分提交的。您应该立即转储您的数据,运行 initdb,然后恢复。恢复后,检查不一致并根据需要进行修复。

如果 pg_resetwal 抱怨它无法确定 pg_control 的有效数据,您可以通过指定 -f(强制)选项强制它继续执行。在这种情况下,将使用合理的值替换丢失的数据。预计大多数字段将匹配,但可能需要手动帮助才能设置下一个 OID、下一个事务 ID 和纪元、下一个多事务 ID 和偏移量以及 WAL 起始位置字段。可以使用下面讨论的选项设置这些字段。如果您无法确定所有这些字段的正确值,仍然可以使用 -f,但恢复的数据库必须比平时更可疑地对待:立即转储和恢复是必要的。不要 在转储之前在数据库中执行任何数据修改操作,因为任何此类操作都可能会加剧损坏。

此实用程序只能由安装服务器的用户运行,因为它需要对数据目录的读写权限。

选项

数据目录
-D 数据目录
--pgdata=数据目录

指定数据库目录的位置。出于安全原因,您必须在命令行上指定数据目录。 pg_resetwal 不使用环境变量 PGDATA

-f
--force

强制 pg_resetwal 即使在上述情况下可能很危险的情况下也继续执行。具体来说,如果服务器没有干净地关闭或者 pg_resetwal 无法确定 pg_control 的有效数据,则需要此选项。

-n
--dry-run

-n/--dry-run 选项指示 pg_resetwal 打印从 pg_control 重构的值以及将要更改的值,然后退出而不修改任何内容。这主要是一个调试工具,但可以在 pg_resetwal 真正进行之前作为健全性检查。

-V
--version

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

-?
--help

显示帮助信息,然后退出。

以下选项仅在 pg_resetwal 无法通过读取 pg_control 来确定适当的值时才需要。可以使用以下描述确定安全值。对于采用数值参数的值,可以使用前缀 0x 指定十六进制值。请注意,这些说明仅适用于 8 kB 的标准块大小。

-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-ISkytools 之类的复制系统正常工作——如果是这样,则可以从下游复制数据库的状态中获得适当的值。

-l walfile
--next-wal-file=walfile

通过指定下一个 WAL 段文件的文件名来手动设置 WAL 起始位置。

下一个 WAL 段文件的文件名应该大于数据目录下 pg_wal 目录中当前存在的任何 WAL 段文件名。这些名称也使用十六进制表示,并包含三部分。第一部分是 时间线 ID,通常应该保持不变。例如,如果 00000001000000320000004Apg_wal 中最大的条目,则使用 -l 00000001000000320000004B 或更高。

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

注意

pg_resetwal 本身会查看 pg_wal 中的文件并选择一个默认的 -l 设置,该设置超过最后一个现有文件名。因此,仅当您知道当前不在 pg_wal 中的 WAL 段文件(例如离线存档中的条目)时,才需要手动调整 -l;或者,如果 pg_wal 的内容已完全丢失。

-m mxid,mxid
--multixact-ids=mxid,mxid

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

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

-o oid
--next-oid=oid

手动设置下一个 OID。

没有类似简单的办法来确定超出数据库中最大 OID 的下一个 OID,但幸运的是,设置下一个 OID 的值并不重要。

-O mxoff
--multixact-offset=mxoff

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

可以通过查找数据目录下 pg_multixact/members 目录中数值最大的文件名,加 1,然后乘以 52352 (0xCC80) 来确定安全值。文件名使用十六进制表示。没有像其他选项那样简单地附加零的方法。

--wal-segsize=wal_segment_size

设置新的 WAL 段大小,以兆字节为单位。该值必须设置为 1 到 1024(兆字节)之间的 2 的幂。有关更多信息,请参见 initdb 的相同选项。

此选项也可以用来更改现有数据库集群的 WAL 段大小,从而避免重新 initdb

注意

虽然 pg_resetwal 会将 WAL 起始地址设置到最后一个现有 WAL 段文件的后面,但某些段大小更改可能会导致以前 WAL 文件名被重用。建议将 -l 与此选项一起使用,以手动设置 WAL 起始地址,如果 WAL 文件名重叠会导致您的归档策略出现问题。

-u xid
--oldest-transaction-id=xid

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

可以通过查找数据目录下 pg_xact 目录中数值最小的文件名,然后乘以 1048576 (0x100000) 来确定安全值。请注意,文件名使用十六进制表示。通常最简单的方法是在十六进制中也指定选项值。例如,如果 0007pg_xact 中最小的条目,则 -u 0x700000 将起作用(五个尾随零提供了正确的乘数)。

-x xid
--next-transaction-id=xid

手动设置下一个事务 ID。

可以通过查找数据目录下 pg_xact 目录中数值最大的文件名,加 1,然后乘以 1048576 (0x100000) 来确定安全的值。请注意,文件名是十六进制的。通常最简单的方法也是用十六进制指定选项值。例如,如果 0011pg_xact 中最大的条目,-x 0x1200000 将有效(五个尾随零提供正确的乘数)。

环境

PG_COLOR

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

注意

当服务器正在运行时,不能使用此命令。如果在数据目录中找到服务器锁文件,pg_resetwal 将拒绝启动。如果服务器崩溃,则可能会留下锁文件;在这种情况下,您可以删除锁文件以允许 pg_resetwal 运行。但在执行此操作之前,请再次确保没有服务器进程仍在运行。

pg_resetwal 仅适用于相同主要版本的服务器。

提交更正

如果您在文档中发现任何不正确的内容,与您对特定功能的体验不符,或者需要进一步澄清,请使用 此表格 报告文档问题。