On this page
Note
pg_resetwal
pg_resetwal —重置 PostgreSQL 数据库集群的预写日志和其他控制信息
Synopsis
pg_resetwal
[ -f
] [ -n
] [ option
...] {[ -D
] datadir
}
Description
pg_resetwal
清除预写日志(WAL),还可以选择重置pg_control
文件中存储的其他一些控制信息。如果这些文件已损坏,则有时需要此功能。当服务器由于这种损坏而无法启动时,仅应将其用作最后的手段。
运行此命令后,应该可以启动服务器,但是请记住,由于部分提交的事务,数据库可能包含不一致的数据。您应该立即转储数据,运行initdb
,然后重新加载。重新加载后,请检查是否存在不一致之处,并根据需要进行维修。
该 Util 只能由安装服务器的用户运行,因为它需要对数据目录的读/写访问权限。出于安全原因,必须在命令行上指定数据目录。 pg_resetwal
不使用环境变量PGDATA
。
如果pg_resetwal
抱怨无法确定pg_control
的有效数据,则可以通过指定-f
(强制)选项来强制其 continue 进行。在这种情况下,将用合理的值代替丢失的数据。可以期望大多数字段都匹配,但是下一个 OID,下一个事务 ID 和纪元,下一个多事务 ID 和偏移量以及 WAL 起始地址字段可能需要手动协助。可以使用下面讨论的选项设置这些字段。如果您无法为所有这些字段确定正确的值,仍可以使用-f
,但是必须比平时更怀疑地对待恢复的数据库:必须立即进行转储和重新加载。 在转储之前,请不要在数据库中执行任何数据修改操作,因为任何此类操作都可能使损坏更加严重。
Options
-f
- 如上所述,即使无法确定
pg_control
的有效数据,也要强制pg_resetwal
continue 进行。
- 如上所述,即使无法确定
-n
-n
(无操作)选项指示pg_resetwal
打印从pg_control
重构的值和将要更改的值,然后退出而不进行任何修改。这主要是一个调试工具,但是在允许pg_resetwal
continue 进行之前,可以用作完整性检查的有用工具。
-V
--version
- 显示版本信息,然后退出。
-?
--help
- 显示帮助,然后退出。
仅当pg_resetwal
无法通过读取pg_control
确定适当的值时,才需要以下选项。可以如下所述确定安全值。对于带有数字参数的值,可以使用前缀0x
指定十六进制值。
-c
xid
,xid
- 手动设置最早和最新的事务 ID,可以检索其提交时间。
可以通过在数据目录下的目录pg_commit_ts
中查找数字上最小的文件名来确定最早的事务 ID 的安全值(可为其确定提交时间)。相反,可以通过在同一目录中查找数字上最大的文件名来确定可为其检索提交时间的最新事务 ID 的安全值(第二部分)。文件名以十六进制表示。
-e
xid_epoch
- 手动设置下一个 TransactionID 的时期。
事务 ID 纪元实际上并未存储在数据库中的任何地方,除了pg_resetwal
设置的字段外,因此就数据库本身而言,任何值都将起作用。您可能需要调整该值,以确保诸如 Slony-I 和 Skytools 之类的复制系统正常工作-如果可以,则应从下游复制数据库的状态中获取适当的值。
-l
walfile
- 手动设置 WAL 起始地址。
WAL 的起始地址应大于数据目录下的pg_wal
1 目录中当前存在的任何 WAL 段文件名。这些名称也以十六进制表示,分为三个部分。第一部分是“时间轴 ID”,通常应保持不变。例如,如果00000001000000320000004A
是pg_wal
中最大的条目,请使用-l 00000001000000320000004B
或更高版本。
Note
pg_resetwal
本身会查看pg_wal
中的文件,并选择除最后一个现有文件名之外的默认-l
设置。因此,仅当您知道pg_wal
中当前不存在的 WAL 段文件(例如脱机归档中的条目)时,才需要手动调整-l
。或pg_wal
的内容已完全丢失。
-m
mxid
,mxid
- 手动设置下一个和最早的多重事务 ID。
可以通过在数据目录下的目录pg_multixact/offsets
中查找数字上最大的文件名,再加一个,然后乘以 65536(0x10000),来确定下一个多重事务 ID(第一部分)的安全值。相反,可以通过在同一目录中查找数字最小的文件名并乘以 65536,来确定最早的多重事务 ID(-m
的第二部分)的安全值。文件名采用十六进制,因此最简单的方法是用于以十六进制指定选项值并附加四个零。
-o
oid
- 手动设置下一个 OID。
确定数据库中最大的下一个 OID 并没有相对简单的方法,但是幸运的是,正确设置下一个 OID 并不重要。
-O
mxoff
- 手动设置下一个多事务偏移。
可以通过在数据目录下的目录pg_multixact/members
中查找数字上最大的文件名,再加一个,然后乘以 52352(0xCC80)来确定安全值。文件名以十六进制表示。没有简单的配方,例如附加零的其他选项的配方。
-x
xid
- 手动设置下一个 TransactionID。
可以通过以下方法确定安全值:在数据目录下的目录pg_xact
中查找数字上最大的文件名,将其加 1,然后乘以 1048576(0x100000)。请注意,文件名以十六进制表示。通常,也最容易以十六进制指定选项值。例如,如果0011
是pg_xact
中最大的条目,则-x 0x1200000
将起作用(五个尾随零将提供适当的乘数)。
Notes
服务器正在运行时,不得使用此命令。 pg_resetwal
如果在数据目录中找到服务器锁定文件,将拒绝启动。如果服务器崩溃,则可能遗留下了锁定文件。在这种情况下,您可以删除锁定文件以允许pg_resetwal
运行。但是在您这样做之前,请先确保没有服务器进程仍在运行。
pg_resetwal
仅适用于相同主版本的服务器。