pg_resetwal

用于重置可能损坏的 WAL 文件的实用程序
此条目与较新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)对其操作理论解释如下:

  1. 读取现有的 pg_control 文件(其中包含最后一个 检查点 记录)。如果格式过旧,则更新为当前格式。(注:代码中的一个较早评论指出这实际上并未完成)。
  2. 如果 pg_control 文件损坏,则尝试通过扫描旧的 xlog(如果需要)来推断合理的数值。
  3. 修改 pg_control 文件,使其反映“关闭”状态,并在 xlog 的开头写入一个检查点记录。
  4. 刷新现有的 xlog 文件,并写入一个仅包含检查点记录的新段。新段的位置恰好在旧 xlog 的末尾之后,这样数据页面中现有的 LSN 将会“过时”。

紧随其后的是评论“除了第 2 步的推断部分之外,其他一切都很直接……

变更历史

从功能角度来看,pg_resetwal 自引入以来基本没有变化,尽管进行了许多内部修复。

示例

--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 内部, 重命名项, 服务器实用程序, 存储, WAL

反馈

在此处 提交有关“pg_resetwal”的任何评论、建议或更正