PostgreSQL运维—pg_resetwal
pg_resetwal
pg_resetwal — 重置PostgreSQL数据库集群的预写日志和其他控制信息
语法
pg_resetwal
[ -f
| --force
] [ -n
| --dry-run
] [option
…] [ -D
| --pgdata
]datadir
描述
If pg_resetwal
complains that it cannot determine valid data for pg_control
, you can force it to proceed anyway by specifying the -f
(force) option. In this case plausible values will be substituted for the missing data. Most of the fields can be expected to match, but manual assistance might be needed for the next OID, next transaction ID and epoch, next multitransaction ID and offset, and WAL starting location fields. These fields can be set using the options discussed below. If you are not able to determine correct values for all these fields, -f
can still be used, but the recovered database must be treated with even more suspicion than usual: an immediate dump and reload is imperative. Do not execute any data-modifying operations in the database before you dump, as any such action is likely to make the corruption worse.
pg_resetwal
清除预写日志 (WAL) 并可选择重置pg_control
文件中存储的一些其他控制信息。如果这些文件已损坏,有时需要此功能。当数据库服务由于这种损坏而无法启动时,它应该仅作为最后的手段使用。
运行此命令后,应该可以启动数据库服务,但请记住,由于部分提交的事务,数据库可能包含不一致的数据。您应该立即转储数据、运行initdb
并重新加载。重新加载后,检查不一致并根据需要进行修复。
此实用程序只能由安装数据库服务的用户运行,因为它需要对数据目录进行读/写访问。出于安全原因,您必须在命令行中指定数据目录。pg_resetwal
不使用环境变量PGDATA
。
如果pg_resetwal
抱怨它无法确定的有效数据,您可以通过指定(force) 选项pg_control
强制它继续进行。-f
在这种情况下,将用合理的值代替缺失的数据。大多数字段都可以匹配,但下一个 OID、下一个事务 ID 和 epoch、下一个多事务 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。
pg_commit_ts
可以通过在数据目录下的目录中查找数字最小的文件名来确定可以检索其提交时间(第一部分)的最早事务 ID 的安全值。相反,可以通过在同一目录中查找数字最大的文件名来确定可以检索其提交时间(第二部分)的最新事务 ID 的安全值。文件名是十六进制的。 -
-e *
xid_epoch*
--epoch=*
xid_epoch*
手动设置下一个事务 ID 的纪元。
事务 ID 纪元实际上并未存储在数据库中的任何位置,除了由 设置的字段,
pg_resetwal
因此就数据库本身而言,任何值都可以使用。您可能需要调整此值以确保Slony-I和Skytools等复制系统正常工作 - 如果是这样,则应从下游复制数据库的状态中获取适当的值。 -
-l *
walfile*
--next-wal-file=*
walfile*
通过指定下一个 WAL 段文件的名称来手动设置 WAL 起始位置。
下一个 WAL 段文件的名称应大于
pg_wal
数据目录下目录中当前存在的任何 WAL 段文件名。这些名称也是十六进制的,由三个部分组成。第一部分是“时间线 ID ”,通常应该保持不变。例如,if00000001000000320000004A
是pg_wal
, use-l 00000001000000320000004B
或更高版本中的最大条目。请注意,当使用非默认 WAL 段大小时,WAL 文件名中的数字与系统函数和系统视图报告的 LSN 不同。此选项采用 WAL 文件名,而不是 LSN。
pg_resetwal
它本身会查看其中的文件并选择最后一个现有文件名之外的pg_wal
默认设置。因此,仅当您知道当前不存在于 中的 WAL 段文件(例如离线存档中的条目)时,才需要-l
手动调整;或者如果 的内容已完全丢失。 -
-m *
mxid*,*
mxid*
--multixact-ids=*
mxid*,*
mxid*
下一个多事务 ID(第一部分)的安全值可以通过在
pg_multixact/offsets
数据目录下的目录中查找数值最大的文件名,加一个,然后乘以 65536(0x10000)来确定。相反,最旧的多事务 ID(的第二部分-m
)的安全值可以通过在同一目录中查找数字最小的文件名并乘以 65536 来确定。文件名是十六进制的,所以最简单的方法是以十六进制指定选项值并附加四个零。 -
-o *
oid*
--next-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 文件名被重用。如果 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
Notes
服务器运行时不得使用此命令。pg_resetwal
如果在数据目录中找到服务器锁定文件,将拒绝启动。如果服务器崩溃,那么可能会留下一个锁定文件;在这种情况下,您可以删除锁定文件以允许pg_resetwal
运行。但在您这样做之前,请加倍确定没有服务器进程仍然存在。
pg_resetwal
仅适用于相同主要版本的服务器。