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 和 epoch、下一个多事务 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。
可以通过查找数据目录下 pg_commit_ts
目录中数值最小的文件名来确定可以检索提交时间的最旧事务 ID 的安全值(第一部分)。相反,可以通过查找同一目录中数值最大的文件名来确定可以检索提交时间的最新的事务 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 段文件(例如脱机存档中的条目)时,或者如果 pg_wal
的内容已完全丢失,才需要手动调整 -l
。
-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 的相同选项。
此选项还可用于更改现有数据库集群的 WAL 段大小,从而避免重新运行 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
仅适用于同一主要版本的服务器。
如果您在文档中发现任何不正确、与您使用特定功能的体验不符或需要进一步澄清的内容,请使用此表单报告文档问题。