此条目与较新PostgreSQL版本中已重命名的功能相关
pg_resetwal
(在 PostgreSQL 9.6 及更早版本中称为 pg_resetxlog
)是一个用于重置可能损坏的 WAL 文件的实用程序。
pg_resetwal
(当时称为 pg_resetxlog
)在 PostgreSQL 7.3 中引入。
重要提示:在处理损坏的 WAL 文件时,pg_resetwal
是“最后的手段”。如果您不熟悉此实用程序(特别是如果您是出于绝望的网络搜索而找到它并寻求快速解决方案),使用 pg_resetwal
可能会使情况变得更糟。
如果您确实有充分的理由使用 pg_resetwal
,请务必极其小心谨慎;强烈建议在进行任何进一步操作之前,在文件系统级别对数据库进行完整备份。
实现
源代码(src/bin/pg_resetwal/pg_resetwal.c)对其操作理论解释如下:
- 读取现有的
pg_control
文件(其中包含最后一个 检查点 记录)。如果格式过旧,则更新为当前格式。(注:代码中的一个较早评论指出这实际上并未完成)。 - 如果
pg_control
文件损坏,则尝试通过扫描旧的 xlog(如果需要)来推断合理的数值。 - 修改
pg_control
文件,使其反映“关闭”状态,并在 xlog 的开头写入一个检查点记录。 - 刷新现有的 xlog 文件,并写入一个仅包含检查点记录的新段。新段的位置恰好在旧 xlog 的末尾之后,这样数据页面中现有的 LSN 将会“过时”。
紧随其后的是评论“除了第 2 步的推断部分之外,其他一切都很直接……”
变更历史
从功能角度来看,pg_resetwal
自引入以来基本没有变化,尽管进行了许多内部修复。
- PostgreSQL 15
- 添加了选项
-u
/--oldest-transaction-id
(提交 74cf7d46)
- 添加了选项
- PostgreSQL 11
- PostgreSQL 10
- 重命名为
pg_resetwal
(提交 85c11324)
- 重命名为
- PostgreSQL 9.5
- PostgreSQL 9.4
- 选项
-n
现在显示即将更改的pg_control
值以及当前值(提交 108e3992)
- 选项
- PostgreSQL 8.0
- 禁止以
root
用户身份执行(提交 75e39c44)
- 禁止以
- PostgreSQL 7.3
- 作为
pg_resetxlog
添加(提交 33e3c9b0)
- 作为
示例
在 --dry-run
模式下执行的 pg_resetwal
示例输出
$ pg_resetwal -D /var/lib/pgsql/node_1/data/ --dry-run Current pg_control values: pg_control version number: 1300 Catalog version number: 202108031 Database system identifier: 6998038587784135836 Latest checkpoint's TimeLineID: 1 Latest checkpoint's full_page_writes: on Latest checkpoint's NextXID: 0:709 Latest checkpoint's NextOID: 16388 Latest checkpoint's NextMultiXactId: 1 Latest checkpoint's NextMultiOffset: 0 Latest checkpoint's oldestXID: 701 Latest checkpoint's oldestXID's DB: 1 Latest checkpoint's oldestActiveXID: 0 Latest checkpoint's oldestMultiXid: 1 Latest checkpoint's oldestMulti's DB: 1 Latest checkpoint's oldestCommitTsXid:708 Latest checkpoint's newestCommitTsXid:708 Maximum data alignment: 8 Database block size: 8192 Blocks per segment of large relation: 131072 WAL block size: 8192 Bytes per WAL segment: 16777216 Maximum length of identifiers: 64 Maximum columns in an index: 32 Maximum size of a TOAST chunk: 1996 Size of a large-object chunk: 2048 Date/time type storage: 64-bit integers Float8 argument passing: by value Data page checksum version: 0 Values to be changed: First log segment after reset: 000000010000000000000002
参考资料
- PostgreSQL 文档: pg_resetwal
有用链接
- pg_resetwal:何时重置 PostgreSQL 中的 WAL - 2023 年 10 月,Hans-Jürgen Schönig / CyberTec 的博文
- pg_resetxlog:希望寄托于运气之时 - 2014 年 8 月,Hans-Jürgen Schönig / CyberTec 的博文
反馈
在此处 提交有关“pg_resetwal
”的任何评论、建议或更正。