Redrock Postgres 搜索 英文
版本: 10 / 11 / 12 / 13 / 14 / 15 / 16 / 17

pg_resetwal

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

语法

pg_resetwal [ -f | --force ] [ -n | --dry-run ] [选项...] [ -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 的时代。

事务 ID 时代实际上未存储在数据库中的任何位置,只存储在由 pg_resetwal 设置的字段中,因此从数据库本身的角度来看,任何值都适用。您可能需要调整此值,以确保诸如 Slony-ISkytools 的复制系统可以正常工作 — 如果是这样,应可以从下游复制数据库的状态中获取合适的值。

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

手动设置 WAL 起始位置,方法是指定下一个 WAL 段文件的文件名。

下一个 WAL 段文件的文件名应大于 data 目录下的 pg_wal 目录中当前存在的任何 WAL 段文件名。这些名称也是十六进制格式,并由三部分组成。第一部分是 时间线 ID,通常应保持不变。例如,如果 00000001000000320000004Apg_wal 中的最大条目,则可以使用 -l 00000001000000320000004B 或更高版本。

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

注意

pg_resetwal 本身会检查 pg_wal 中的文件,并选择以超出最后一个现有文件名的方式默认设置 -l。因此,只有在你意识到未在 pg_wal 中存在的 WAL 段文件(如离线归档中的条目)时,才需要手动调整 -l;或者 pg_wal 的内容已全部丢失时,才需要手动调整。

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

手动设置下一个和最旧的多事务 ID。

可以通过在 data 目录下的 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 的相同选项。

还可使用此选项来更改现有数据库集群的 WAL 段大小,无需重新进行 initdb 操作。

注意

尽管 pg_resetwal 会将 WAL 起始地址设置在最新存在的 WAL 段文件之外,但某些段大小更改会导致重复使用以前的 WAL 文件名。建议将 -l 与此选项结合使用,以手动设置 WAL 起始地址,如果 WAL 文件名重叠会导致归档策略出现问题。

-u xid
--oldest-transaction-id=xid

手动设置最旧的未冻结事务 ID。

在数据目录下的目录 pg_xact 中查找数值上最小的文件名,然后乘以 1048576 (0x100000),即可确定一个安全值。请注意,文件名采用十六进制表示。通常最简单的方法是用十六进制指定选项值。例如,如果 0007pg_xact 中最小的条目,那么 -u 0x700000 将起作用(五个尾随零提供了适当的乘数)。

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

手动设置下一个事务 ID。

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

环境

PG_COLOR

指定是否在诊断消息中使用颜色。可能的值包括 alwaysautonever

注释

服务器正在运行时,不得使用该命令。pg_resetwal 在数据目录中发现服务器锁定文件后,会拒绝启动。如果服务器已崩溃,则可能遗留下一个锁定文件;在这种情况下,你可以删除锁定文件,允许 pg_resetwal 运行。但在这样做之前,务必确保没有服务器进程仍在运行。

pg_resetwal 只能与同一主要版本的服务器一起使用。

另请参见

pg_controldata