pg_resetwal

重置可能损坏的 WAL 文件的实用程序

pg_resetwal (PostgreSQL 9.6 及更早版本: pg_resetxlog) 是一种用于重置可能损坏的 WAL 文件的实用程序。

pg_resetwalPostgreSQL 7.3 中添加(作为 pg_resetxlog)。

重要:在处理损坏的 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 从功能的角度来看,自引入以来基本上没有变化,尽管进行了许多内部修复。

示例

示例 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 内部机制服务器实用程序存储WAL

反馈

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