pg_resetwal — 重置一个PostgreSQL数据库集簇的预写式日志以及其他控制信息
pg_resetwal
[-f
] [-n
] [option
...] {[-D
] datadir
}
pg_resetwal
会清除预写式日志(WAL)并且有选择地重置存储在
pg_control
文件中的一些其他控制信息。如果这些文件已经被损坏,
某些时候就需要这个功能。当服务器由于这样的损坏而无法启动时,
这只应该被用作最后的手段。
在运行这个命令之后,就应该可以启动服务器,
但是记住数据库可能包含由于部分提交事务产生的不一致数据。
你应当立刻转储你的数据、运行initdb
并且重新载入。重新载入后,
检查不一致并且根据需要修复之。
这个工具只能被安装服务器的用户运行,因为它要求对数据目录的读写访问。
出于安全原因,你必须在命令行中指定数据目录。pg_resetwal
不使用环境变量PGDATA
。
如果pg_resetwal
抱怨它无法为pg_control
决定合法数据,你可以通过指定-f
(强制)选项强制它继续。
在这种情况下,丢失的数据将被替换为看似合理的值。可以期望大部分域是匹配的,
但是下一个 OID、下一个事务 ID 和纪元、下一个多事务 ID 和偏移以及 WAL
开始地址域可能还是需要人工协助。这些域可以使用下面讨论的选项设置。
如果你不能为所有这些域决定正确的值,-f
还是可以被使用,
但是恢复的数据库还是值得怀疑:一次立即的转储和重新载入是势在必行的。
在你转储之前不要在该数据库中执行任何数据修改操作,
因为任何这样的动作都可能使破坏更严重。
-f
即使pg_resetwal
无法从pg_control
中确定有效的数据(如前面所解释的),也强迫pg_resetwal
继续运行。
-n
-n
(无操作)选项指示pg_resetwal
打印从
pg_control
重构出来的值以及要被改变的值,然后不修改任何东西退出。
这主要是一个调试工具,但是可以用来在允许pg_resetwal
真正执行下去之前进行完整性检查。
-V
--version
显示版本信息然后退出。
-?
--help
显示帮助然后退出。
只有当pg_resetwal
无法通过读取pg_control
确定合适的值时,才需要下列选项。安全值可以按下文所述来确定。
对于接收数字参数的值,可以使用前缀0x
指定 16 进制值。
-c
xid
,xid
手工设置提交时间可以检索到的最老的和最新的事务 ID。
能检索到提交时间的最老事务 ID 的安全值(第一部分)可以通过在数据目录下
pg_commit_ts
目录中数字上最小的文件名来决定。反过来,
能检索到提交时间的最新事务 ID 的安全值(第二部分)
可以通过同一个目录中数字上最大的文件名来决定。文件名都是十六进制的。
-e
xid_epoch
手工设置下一个事务 ID 的 epoch。
事务 ID 的 epoch 实际上并没有存储在数据库中的任何地方,
除了被pg_resetwal
设置在这个域中,
所以只要关心的是数据库本身,任何值都可以用。
你可能需要调整这个值来确保诸如Slony-I和Skytools
之类的复制系统正确地工作 — 如果确实需要调整,
应该可以从下游的复制数据库的状态中获得一个合适的值。
-l
walfile
手工设置 WAL 开始地址。
WAL 起始地址应该比当前存在于数据目录下pg_wal
目录中的任意 WAL 段文件名更大。这些名称也是十六进制的并且有三个部分。
第一部分是“时间线 ID”并且通常应该被保持相同。例如,
如果00000001000000320000004A
是pg_wal
中最大的项,
则使用-l 00000001000000320000004B
或更高的值。
pg_resetwal
本身查看pg_wal
中的文件并选择一个超出最新现存文件名的默认-l
设置。因此,
只有当你知道 WAL 段文件当前不在pg_wal
中时,
或者当pg_wal
的内容完全丢失时,才需要对-l
的手工调整,例如一个离线归档中的项。
-m
mxid
,mxid
手工设置下一个和最老的多事务 ID。
确定下一个多事务 ID(第一部分)的安全值的方法:在数据目录下的
pg_multixact/offsets
目录中查找最大的数字文件名,
然后在它的基础上加一并且乘以 65536 (0x10000)。反过来,
确定最老的多事务 ID(-m
的第二部分)的方法:
在同一个目录中查找最小的数字文件名并且乘以 65536。文件名是十六进制的数字,
因此实现上述方法最简单的方式是以十六进制指定选项值并且追加四个零。
-o
oid
手工设置下一个 OID。
没有相对容易的方法来决定超过数据库中最大 OID 的下一个 OID。 但幸运的是正确地得到下一个 OID 设置并不是决定性的。
-O
mxoff
手工设置下一个多事务偏移量。
确定安全值的方法:查找数据目录下pg_multixact/members
目录中最大的数字文件名,然后在它的基础上加一并且乘以 52352 (0xCC80)。
文件名是十六进制数字。没有像其他选项那样追加零的简单方法。
-x
xid
手工设置下一个事务 ID。
确定安全值的方法:在数据目录下的pg_xact
目录中查找最大的数字文件名,
然后在它的基础上加一并且乘以 1048576 (0x100000)。注意文件名是十六进制的数字。
通常以十六进制的形式指定该选项值也是最容易的。例如,如果0011
是pg_xact
中的最大项,-x 0x1200000
就可以
(五个尾部的零就表示了前面说的乘数)。
这个命令不能在服务器正在运行时被使用。如果在数据目录中发现一个服务器锁文件,
pg_resetwal
将拒绝启动。如果服务器崩溃那么一个锁文件可能会被留下,
在那种情况下你能移除该锁文件来让pg_resetwal
运行。
但是在你那样做之前,再次确认没有服务器进程仍然存活。
pg_resetwal
仅适用于相同主要版本的服务器。