Note

pg_resetwal

pg_resetwal —重置 PostgreSQL 数据库集群的预写日志和其他控制信息

Synopsis

pg_resetwal [ --force | -f ] [ --dry-run | -n ] [ option ...] [ --pgdata | -D ] datadir

Description

pg_resetwal清除预写日志(WAL),还可以选择重置pg_control文件中存储的其他一些控制信息。如果这些文件已损坏,则有时需要此功能。当服务器由于这种损坏而无法启动时,仅应将其用作最后的手段。

运行此命令后,应该可以启动服务器,但是请记住,由于部分提交的事务,数据库可能包含不一致的数据。您应该立即转储数据,运行initdb,然后重新加载。重新加载后,请检查是否存在不一致之处,并根据需要进行维修。

该 Util 只能由安装服务器的用户运行,因为它需要对数据目录的读/写访问权限。出于安全原因,必须在命令行上指定数据目录。 pg_resetwal不使用环境变量PGDATA

如果pg_resetwal抱怨无法确定pg_control的有效数据,则可以通过指定-f(强制)选项来强制其 continue 进行。在这种情况下,将用合理的值代替丢失的数据。可以预期大多数字段都将匹配,但是下一个 OID,下一个事务 ID 和纪元,下一个多事务 ID 和偏移量以及 WAL 起始位置字段可能需要手动协助。可以使用下面讨论的选项设置这些字段。如果您不能为所有这些字段确定正确的值,仍可以使用-f,但是必须比平时更怀疑地对待恢复的数据库:必须立即进行转储和重新加载。 在转储之前,请不要在数据库中执行任何数据修改操作,因为任何此类操作都可能使损坏更加严重。

Options

  • -f
    --force

    • 如上所述,即使无法确定pg_control的有效数据,也要强制pg_resetwalcontinue 进行。
  • -n
    --dry-run

    • -n/--dry-run选项指示pg_resetwal打印从pg_control重构的值和将要更改的值,然后退出而不进行任何修改。这主要是调试工具,但在允许pg_resetwalcontinue 进行之前,可以用作完整性检查的有用工具。
  • -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

    • 手动设置下一个 TransactionID 的时期。

事务 ID 纪元实际上并未存储在数据库中的任何地方,除了pg_resetwal设置的字段外,因此就数据库本身而言,任何值都将起作用。您可能需要调整该值,以确保诸如 Slony-I 和 Skytools 之类的复制系统正常工作-如果可以,则应从下游复制数据库的状态中获取适当的值。

  • -l walfile
    --next-wal-file=walfile

    • 通过指定下一个 WAL 段文件的名称来手动设置 WAL 的起始位置。

下一个 WAL 段文件的名称应大于数据目录下的pg_wal目录中当前存在的任何 WAL 段文件的名称。这些名称也以十六进制表示,分为三个部分。第一部分是“时间轴 ID”,通常应保持不变。例如,如果00000001000000320000004Apg_wal中最大的条目,请使用-l 00000001000000320000004B或更高版本。

请注意,当使用非默认 WAL 段大小时,WAL 文件名中的数字与系统功能和系统视图报告的 LSN 不同。此选项采用 WAL 文件名,而不是 LSN。

Note

pg_resetwal本身会查看pg_wal中的文件,并选择除最后一个现有文件名之外的默认-l设置。因此,仅当您知道pg_wal中当前不存在的 WAL 段文件(例如脱机归档中的条目)时,才需要手动调整-l。或pg_wal的内容已完全丢失。

  • -m mxid,mxid
    --multixact-ids=mxid,mxid

    • 手动设置下一个和最早的多重事务 ID。

可以通过在数据目录下的目录pg_multixact/offsets中查找数字上最大的文件名,再加一个,然后乘以 65536(0x10000),来确定下一个多重事务 ID(第一部分)的安全值。相反,可以通过在同一目录中查找数字最小的文件名并乘以 65536 来确定最早的多重事务 ID(-m的第二部分)的安全值。文件名采用十六进制,因此最简单的方法是用于以十六进制指定选项值并附加四个零。

  • -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的相同选项。

Note

尽管pg_resetwal会将 WAL 起始地址设置为最新的现有 WAL 段文件之外,但某些段大小的更改可能导致以前的 WAL 文件名被重用。如果 WAL 文件名重叠会导致归档策略出现问题,建议与-l一起使用以手动设置 WAL 起始地址。

  • -x xid
    --next-transaction-id=xid

    • 手动设置下一个 TransactionID。

可以通过以下方法确定安全值:在数据目录下的目录pg_xact中查找数字上最大的文件名,将其加一个,然后乘以 1048576(0x100000)。请注意,文件名以十六进制表示。通常,也最容易以十六进制指定选项值。例如,如果0011pg_xact中最大的条目,则-x 0x1200000将起作用(五个尾随零将提供适当的乘数)。

Notes

服务器正在运行时,不得使用此命令。 pg_resetwal如果在数据目录中找到服务器锁定文件,将拒绝启动。如果服务器崩溃,则可能遗留下了锁定文件。在这种情况下,您可以删除锁定文件以允许pg_resetwal运行。但是在您这样做之前,请先确保没有服务器进程仍在运行。

pg_resetwal仅适用于相同主版本的服务器。

See Also

pg_controldata