pg_resetwal
(PostgreSQL 9.6 及更早版本: pg_resetxlog
) 是一种用于重置可能损坏的 WAL 文件的实用程序。
pg_resetwal
在 PostgreSQL 7.3 中添加(作为 pg_resetxlog
)。
重要:在处理损坏的 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)
- 添加为
示例
示例 pg_resetwal
输出,在 --dry-run
模式下执行
$ 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 博客文章