pg_resetwal
pg_resetwal — 重置PostgreSQL数据库集群的预写日志和其他控制信息
概要
pg_resetwal
[-f
|--force
] [-n
|--dry-run
] [option
...] [-D
|--pgdata
]datadir
描述
pg_resetwal
清除预写日志 (WAL),并可以选择重置存储在pg_control
文件中的其他一些控制信息。如果这些文件已损坏,有时需要此功能。仅当服务器因这种损坏而无法启动时,才应将其作为最后手段使用。
运行此命令后,应该可以启动服务器,但请记住,数据库可能包含不一致的数据,因为事务已部分提交。您应该立即转储数据,运行initdb
,然后还原。还原后,检查不一致之处并根据需要进行修复。
此实用程序只能由安装服务器的用户运行,因为它需要对数据目录进行读/写访问。出于安全原因,您必须在命令行中指定数据目录。pg_resetwal
不使用环境变量PGDATA
。
如果pg_resetwal
抱怨它无法确定pg_control
的有效数据,您可以通过指定-f
(强制)选项来强制它继续。在这种情况下,将为缺失的数据代入合理的值。大多数字段预计会匹配,但可能需要手动帮助来获取下一个 OID、下一个事务 ID 和纪元、下一个多事务 ID 和偏移量以及 WAL 起始位置字段。可以使用下面讨论的选项设置这些字段。如果您无法确定所有这些字段的正确值,仍然可以使用-f
,但恢复的数据库必须比平时更加可疑:立即转储和还原势在必行。不要在转储之前在数据库中执行任何数据修改操作,因为任何此类操作都可能使损坏情况变得更糟。
选项
-f
--force
强制
pg_resetwal
继续,即使它无法确定pg_control
的有效数据,如上所述。-n
--dry-run
-n
/--dry-run
选项指示pg_resetwal
打印从pg_control
重建的值和将要更改的值,然后退出而不修改任何内容。这主要是一个调试工具,但在允许pg_resetwal
真正继续之前,可以作为健全性检查使用。-V
--version
显示版本信息,然后退出。
-?
--help
显示帮助,然后退出。
```仅当pg_resetwal
无法通过读取pg_control
确定适当的值时,才需要以下选项。可以按照以下所述确定安全值。对于采用数字参数的值,可以使用前缀0x
指定十六进制值。
-c
xid
,xid
--commit-timestamp-ids=
xid
,xid
手动设置可以检索提交时间的最小和最大事务 ID。
可以检索提交时间的最小事务 ID(第一部分)的安全值,方法是查找数据目录下
pg_commit_ts
目录中数字最小的文件名。相反,可以检索提交时间的最大事务 ID(第二部分)的安全值,方法是查找同一目录中数字最大的文件名。文件名以十六进制表示。-e
xid_epoch
--epoch=
xid_epoch
手动设置下一个事务 ID 的 epoch。
事务 ID epoch 实际上没有存储在数据库中的任何位置,除了由
pg_resetwal
设置的字段之外,因此就数据库本身而言,任何值都适用。您可能需要调整此值以确保复制系统(例如 Slony-I 和 Skytools)正常工作——如果是这样,应该可以从下游复制数据库的状态中获取适当的值。-l
walfile
--next-wal-file=
walfile
通过指定下一个 WAL 段文件的文件名手动设置 WAL 开始位置。
下一个 WAL 段文件的名称应大于数据目录下
pg_wal
目录中当前存在的任何 WAL 段文件名。这些名称也采用十六进制表示,并分为三部分。第一部分是 “时间线 ID”,通常应保持不变。例如,如果00000001000000320000004A
是pg_wal
中最大的条目,请使用-l 00000001000000320000004B
或更高版本。请注意,在使用非默认 WAL 段大小时,WAL 文件名中的数字与系统函数和系统视图报告的 LSN 不同。此选项采用 WAL 文件名,而不是 LSN。
注意
pg_resetwal
本身会查看pg_wal
中的文件,并选择一个默认-l
设置,该设置超出最后一个现有文件名。因此,只有在您知道当前不在pg_wal
中的 WAL 段文件(例如脱机存档中的条目)时,才需要手动调整-l
;或者当pg_wal
的内容完全丢失时。-m
mxid
,mxid
--multixact-ids=
mxid
,mxid
手动设置下一个和最旧的多事务 ID。
可以通过查找数据目录下
pg_multixact/offsets
目录中数字最大的文件名,加 1,然后乘以 65536 (0x10000) 来确定下一个多事务 ID(第一部分)的安全值。相反,可以通过查找同一目录中数字最小的文件名并乘以 65536 来确定最旧多事务 ID(-m
的第二部分)的安全值。文件名采用十六进制表示,因此最简单的方法是以十六进制指定选项值并追加四个零。-o
oid
--next-oid=
oid
手动设置下一个 OID。
没有一种简单的方法来确定超出数据库中最大 OID 的下一个 OID,但幸运的是,正确设置下一个 OID 并不是至关重要的。
-O
mxoff
--multixact-offset=
mxoff
手动设置下一个多事务偏移量。
可以通过查找数据目录下
pg_multixact/members
目录中数字最大的文件名,加一,然后乘以 52352 (0xCC80) 来确定一个安全的值。文件名以十六进制表示。没有像其他追加零选项那样的简单配方。--wal-segsize=
wal_segment_size
设置新的 WAL 段大小(以兆字节为单位)。该值必须设置为 1 到 1024(兆字节)之间的 2 的幂。有关更多信息,请参阅 initdb 的相同选项。
注意
虽然
pg_resetwal
会将 WAL 起始地址设置为超过最新存在的 WAL 段文件,但某些段大小更改会导致重复使用以前的 WAL 文件名。建议将-l
与此选项一起使用,以在 WAL 文件名重叠会给归档策略带来问题时手动设置 WAL 起始地址。-u
xid
--oldest-transaction-id=
xid
手动设置最旧的未冻结事务 ID。
可以通过查找数据目录下
pg_xact
目录中数字最小的文件名,然后乘以 1048576 (0x100000) 来确定一个安全的值。请注意,文件名以十六进制表示。通常最容易以十六进制指定选项值。例如,如果0007
是pg_xact
中最小的条目,则-u 0x700000
将起作用(五个尾随零提供了适当的乘数)。-x
xid
--next-transaction-id=
xid
手动设置下一个事务 ID。
可以通过查找数据目录下
pg_xact
目录中数字最大的文件名,加一,然后乘以 1048576 (0x100000) 来确定一个安全值。请注意,文件名以十六进制表示。通常最简单的方法是用十六进制指定选项值。例如,如果0011
是pg_xact
中最大的条目,-x 0x1200000
将起作用(五个尾随零提供了适当的乘数)。
``
环境
PG_COLOR
指定是否在诊断消息中使用颜色。可能的值为
always
、auto
和never
。
注释
服务器运行时不得使用此命令。如果pg_resetwal
在数据目录中找到服务器锁定文件,它将拒绝启动。如果服务器崩溃,则可能留下一个锁定文件;在这种情况下,您可以删除锁定文件以允许pg_resetwal
运行。但在这样做之前,请双重确保没有服务器进程仍然处于活动状态。
pg_resetwal
仅适用于相同主版本的服务器。