pg_resetwal — 重置一个PostgreSQL数据库集簇的预写式日志以及其他控制信息
pg_resetwal
[ -f
| --force
] [ -n
| --dry-run
] [option
...] [ -D
| --pgdata
]datadir
pg_resetwal
会清除预写式日志(WAL)并且有选择地重置存储在pg_control
文件中的一些其他控制信息。如果这些文件已经被损坏,某些时候就需要这个功能。当服务器由于这样的损坏而无法启动时,这只应该被用作最后的手段。
一些选项,例如 --wal-segsize
(见下文),也可以用来修改数据库集群的某些全局设置,
无需重新运行 initdb
。如果不使用下面提到的任何危险模式,这可以在其他方面正常的数据库集群上安全地完成。
如果在服务器已正常关闭且控制文件完好的数据目录上使用pg_resetwal
,那么它不会对数据库系统的内容产生影响,
除了清除不再使用的WAL文件。任何其他用途都可能存在危险,必须非常小心地进行。pg_resetwal
在处理未正常关闭状态
或控制文件损坏的数据目录时,必须指定-f
(强制)选项。
在包含损坏的WAL或损坏的控制文件的数据目录上运行此命令后,应该可以启动服务器,
但请记住,数据库可能包含由于部分提交事务导致的不一致数据。您应立即导出数据,
运行initdb
,然后恢复。恢复后,检查不一致情况并根据需要修复。
如果pg_resetwal
报告无法确定pg_control
的有效数据,
您可以通过指定-f
(强制)选项来强制执行。在这种情况下,可能会为缺失的数据
替换合理的值。大多数字段可以预期匹配,但可能需要手动协助来设置下一个OID、下一个事务ID和时代、
下一个多事务ID和偏移以及WAL起始位置字段。可以使用下面讨论的选项来设置这些字段。如果您无法
确定所有这些字段的正确值,仍然可以使用-f
,但是必须对恢复的数据库更加怀疑:
立即进行转储和恢复是必要的。在转储之前不要在数据库中执行任何修改数据的操作,
因为任何此类操作可能会使损坏变得更糟。
该工具只能由安装服务器的用户运行,因为它需要对数据目录具有读/写权限。
datadir
-D datadir
--pgdata=datadir
指定数据库目录的位置。出于安全原因,您必须在命令行上指定数据目录。
pg_resetwal
不使用环境变量 PGDATA
。
-f
--force
强制pg_resetwal
继续执行,即使在上述可能存在危险的情况下。
具体来说,如果服务器未正常关闭,或者pg_resetwal
无法确定
pg_control
的有效数据,则需要此选项才能继续。
-n
--dry-run
-n
/--dry-run
选项指示pg_resetwal
打印从pg_control
重构出来的值以及要被改变的值,然后不修改任何东西退出。这主要是一个调试工具,但是可以用来在允许pg_resetwal
真正执行下去之前进行完整性检查。
-V
--version
显示版本信息然后退出。
-?
--help
显示帮助然后退出。
以下选项仅在pg_resetwal
无法通过读取pg_control
确定合适的值时才需要。
可以按照下面描述的方法确定安全的值。对于需要数值参数的值,可以使用前缀0x
指定十六进制值。
注意,这些说明仅适用于标准块大小为8 kB的情况。
-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
设置。因此,只有当你知道 WAL 段文件当前不在pg_wal
中时,或者当pg_wal
的内容完全丢失时,才需要对-l
的手工调整,例如一个离线归档中的项。
-m mxid
,mxid
--multixact-ids=mxid
,mxid
手工设置下一个和最老的多事务 ID。
确定下一个多事务 ID(第一部分)的安全值的方法:在数据目录下的pg_multixact/offsets
目录中查找最大的数字文件名,然后在它的基础上加一并且乘以 65536 (0x10000)。反过来,确定最老的多事务 ID(-m
的第二部分)的方法:在同一个目录中查找最小的数字文件名并且乘以 65536。文件名是十六进制的数字,因此实现上述方法最简单的方式是以十六进制指定选项值并且追加四个零。
-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段尺寸,以兆字节为单位。这个值必须被设为2的1次幂和1024次幂(兆字节)之间。更多信息请参考initdb的相同选项。
此选项也可用于更改现有数据库集群的 WAL 段大小,避免了重新
re-initdb
的需要。
虽然pg_resetwal
将把WAL起始地址设置成超过最新的现有WAL段文件,但一些段尺寸的改变可能导致之前的WAL文件名被重用。如果WAL文件名重叠会导致归档策略出现问题,推荐把-l
和这个选项一起使用来手动设置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
仅能在具有相同主版本的服务器上使用。