↑↓ 选择↵ 打开⌫ 切换范围完整搜索

PG.CENTER 连接 PostgreSQL 文档、百科与生态知识。由 Pigsty 维护。

支持中的版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发中的版本: 19 / 20devel
已结束支持的版本: 13 / 12 / 11 / 10
历史版本。 PostgreSQL 10 已结束支持。 2022-11-10. 请参阅 当前版本手册.

pg_resetwal

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

大纲

pg_resetwal [-f] [-n] [option...] {[-D] datadir}

描述

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

运行此命令后,服务器应该可以启动;但请记住,由于仅部分提交的事务,数据库中可能含有不一致的数据。应立即转储数据,运行 initdb,然后恢复。恢复后,请检查是否存在不一致并按需修复。

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

如果 pg_resetwal 报告无法确定 pg_control 的有效数据,则可以通过指定 -f(强制)选项强行继续。在这种情况下,缺失的数据将以看似合理的值代替。大多数字段预计都能匹配,但对于下一个 OID、下一个事务 ID 及其纪元、下一个多事务 ID 及其偏移量,以及 WAL 起始位置字段,可能仍需要人工协助。这些字段可通过下文讨论的选项来设置。如果无法为所有这些字段确定正确值,仍然可以使用 -f,但恢复得到的数据库必须比平时更受怀疑:立即转储并恢复势在必行。切勿在完成转储之前对数据库执行任何修改数据的操作,因为任何此类操作都很可能使损坏进一步恶化。

选项

-f

如上所述,即使 pg_resetwal 无法确定 pg_control 的有效数据,也强制其继续执行。

-n

-n(不执行操作)选项指示 pg_resetwal 打印从 pg_control 重建的值以及即将更改的值,然后退出,不修改任何内容。这主要是一个调试工具,但在允许 pg_resetwal 真正执行之前,也可以用它进行合理性检查。

-V
--version

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

-?
--help

显示帮助,然后退出。

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

-c xid,xid

手工设置可检索提交时间的最旧和最新事务 ID。

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

-e xid_epoch

手工设置下一个事务 ID 的纪元。

事务 ID 纪元实际上并未存储在数据库中的任何地方,除了由 pg_resetwal 设置的这个字段,因此就数据库本身而言,任何值都可用。可能需要调整该值,以确保 Slony-I 和 Skytools 等复制系统正常工作 — 如果确有需要,应该可以从下游复制数据库的状态中获得合适的值。

-l walfile

手动设置 WAL 起始位置。

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

注意

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

-m mxid,mxid

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

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

-o oid

手工设置下一个 OID。

并没有同样简单的方法来确定一个超出数据库中最大 OID 的下一个 OID,不过幸运的是,下一个 OID 的设置是否精确并不关键。

-O mxoff

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

安全值可以通过查看数据目录下 pg_multixact/members 目录中数值最大的文件名,先加一,再乘以 52352 (0xCC80) 来确定。文件名是十六进制。这里没有像其他选项那样通过追加零即可得到结果的简单方法。

-u xid

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

安全值可以通过查看数据目录下 pg_xact 目录中数值最小的文件名,再乘以 1048576 (0x100000) 来确定。请注意,文件名是十六进制。通常,选项值也用十六进制指定最为简单。例如,如果 0007 是 pg_xact 中最小的条目,那么 -u 0x700000 就可以使用(五个尾随零提供了正确的乘数)。

-x xid

手工设置下一个事务 ID。

安全值可以通过查看数据目录下 pg_xact 目录中数值最大的文件名,先加一,再乘以 1048576 (0x100000) 来确定。请注意,文件名是十六进制。通常,选项值也用十六进制指定最为简单。例如,如果 0011 是 pg_xact 中最大的条目,那么 -x 0x1200000 就可以使用(五个尾随零提供了正确的乘数)。

注解

服务器运行期间不得使用此命令。如果在数据目录中发现服务器锁文件,pg_resetwal 将拒绝启动。如果服务器曾崩溃,可能遗留锁文件;在这种情况下,可以删除该锁文件以允许 pg_resetwal 运行。但在这样做之前,务必再三确认没有任何服务器进程仍在运行。

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

报告文档问题

阅读 上游文档. 反馈更正前请先核对 当前版本手册.