pg_resetwal — 重置 PostgreSQL 数据库集群的预写日志(write-ahead log)和其他控制信息
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
(force)选项。
在具有损坏的 WAL 或损坏的控制文件的数据库目录上运行此命令后,应该能够启动服务器,但请记住,由于部分提交的事务,数据库可能包含不一致的数据。您应该立即转储数据,运行 initdb
,然后恢复。恢复后,检查不一致并根据需要进行修复。
如果 pg_resetwal
报告无法确定 pg_control
的有效数据,您可以通过指定 -f
(force)选项来强制它继续。在这种情况下,将为缺失的数据替换合理的默认值。大多数字段应该能匹配,但对于下一个 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。
可以检索提交时间的,最旧事务 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”(timeline 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。
下一个多事务 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) 来确定一个安全值。文件名是十六进制的。没有像其他选项那样简单地附加零的配方。
-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
将可用(五个零表示正确的乘数)。
--char-signedness=option
手动设置默认的 char 有符号性。可能的值是 signed
和 unsigned
。
对于从 PostgreSQL 18 之前的版本通过 pg_upgrade
升级的数据库集群,安全值应该是升级前运行该集群的平台的默认 char
有符号性。对于所有其他集群,signed
是安全值。但是,此选项仅用于 pg_upgrade
,通常不应手动使用。
--wal-segsize=wal_segment_size
设置新的 WAL 段大小(以兆字节为单位)。该值必须设置为 1 到 1024(兆字节)之间的 2 的幂。有关更多信息,请参见 initdb 的相同选项。
此选项也可用于更改现有数据库集群的 WAL 段大小,从而无需重新 initdb
。
虽然 pg_resetwal
会将 WAL 起始地址设置为最新的现有 WAL 段文件之后,但某些段大小的更改可能导致先前 WAL 文件名被重用。建议与此选项一起使用 -l
来手动设置 WAL 起始地址,如果 WAL 文件名重叠会影响您的归档策略。
PG_COLOR
指定是否在诊断消息中使用颜色。可能的值为 always
、auto
和 never
。
服务器运行时不得使用此命令。pg_resetwal
如果在数据目录中发现服务器锁文件,将拒绝启动。如果服务器崩溃,则可能留下了锁文件;在这种情况下,您可以删除锁文件以允许 pg_resetwal
运行。但在这样做之前,请务必确保没有服务器进程仍在运行。
pg_resetwal
仅与同主版本的服务器一起工作。
如果您在文档中发现任何不正确、与您在该功能上的实际经验不符或需要进一步说明的内容,请使用 此表单 报告文档问题。