选择 打开 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

受支持版本: 当前版本 (18) / 当前版本 (18) / 17 / 17 / 16 / 16 / 15 / 15 / 14 / 14
测试与开发版本: 19 / 19 / devel / devel
不受支持的版本: 13 / 13 / 12 / 12 / 11 / 11 / 10 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0
历史版本PostgreSQL 9.1 已于 2016 年 10 月结束社区维护,本页译文保留供仍在使用旧版本的读者参考。新系统请看当前版本

pg_resetxlog

pg_resetxlog — reset the write-ahead log and other control information of a PostgreSQL database cluster

大纲

pg_resetxlog [-f] [-n] [-ooid ] [-x xid ] [-e xid_epoch ] [-m mxid ] [-O mxoff ] [-l timelineid,fileid,seg ] datadir

描述

pg_resetxlog 清空事务日志(WAL),并有选择地重置 pg_control 文件中存储的一些其他控制信息。当这些文件 损坏时,有时就需要这项功能。它应当只作为最后的手段使用,即当服务器因这种 损坏而无法启动时。

运行这条命令之后,应当就能启动服务器了,但请记住,由于部分提交的事务, 数据库中可能包含不一致的数据。你应当立即转储数据、运行 initdb 并重新装载。重新装载之后,检查不一致之处并按需修复。

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

如果 pg_resetxlog 抱怨说无法确定 pg_control 的有效数据,你可以通过指定 -f(强制)选项迫使它继续执行。 在这种情况下,缺失的数据会用貌似合理的值代替。大多数字段都可以期望是匹配的, 但下一个 OID、下一个事务 ID 及其纪元、下一个多事务 ID 及偏移量、WAL 起始地址 这些字段可能需要人工协助。这些字段可以用下面讨论的选项来设置。如果你无法为 所有这些字段确定正确的值,仍可以使用 -f,但恢复出的数据库 必须受到比平常更多的怀疑:必须立即转储并重新装载。在转储之前不要 在数据库中执行任何修改数据的操作,因为任何此类操作都很可能使损坏加剧。

-o-x-e-m-O-l 选项允许手动设置下一个 OID、下一个事务 ID、下一个事务 ID 的纪元、 下一个和最旧的多事务 ID、下一个多事务偏移量以及 WAL 起始地址。只有当 pg_resetxlog 无法通过读取 pg_control 确定合适的值时,才需要 这些选项。安全值可以按如下方法确定:

  • 下一个事务 ID(-x)的安全值可以通过在数据目录下的 pg_clog 目录中查找数值最大的文件名、加一、 再乘以 1048576 来确定。注意文件名为十六进制。通常最简单的做法也是 用十六进制指定选项值。例如,如果 0011pg_clog 中最大的项,则 -x 0x1200000 可行(五个尾随零提供正确的乘数)。

  • 下一个多事务 ID(-m)的安全值可以这样确定:在数据目录下的 pg_multixact/offsets 目录中找出数值最大的文件名,加一,再乘以 65536。如上所述,文件名是十六进制的,所以最简单的做法是用十六进制指定开关值并加上四个零。

  • 下一个多事务偏移(-O)的安全值可以这样确定:在数据目录下的 pg_multixact/members 目录中找出数值最大的文件名,加一,再乘以 65536。如上所述,文件名是十六进制的,所以最简单的做法是用十六进制指定开关值并加上四个零。

  • WAL 起始地址(-l)应当大于数据目录下 pg_xlog 目录中现存的任何 WAL 段文件名。这些名称也是十六进制的,并且由三部分组成。第一部分是时间线 ID,通常应保持不变。第三部分不要选择大于 255(0xFF)的值;应当递增第二部分并把第三部分重置为 0。例如,如果 00000001000000320000004Apg_xlog 中最大的项,-l 0x1,0x32,0x4B 即可;但如果最大的项是 000000010000003A000000FF,请选择 -l 0x1,0x3B,0x0 或更大。

    注意

    pg_resetxlog 本身会查看 pg_xlog 中的文件,并选择一个超出最后一个现存文件名的默认 -l 设置。因此,只有当你知道存在当前不在 pg_xlog 中的 WAL 段文件(例如离线归档中的条目),或者 pg_xlog 的内容已完全丢失时,才需要手动调整 -l

  • 没有同样简单的方法来确定一个超出数据库中最大 OID 的下一个 OID, 但幸运的是,下一个 OID 设置得是否正确并不关键。

  • 事务 ID 纪元实际上并不存储在数据库中的任何地方(由 pg_resetxlog 设置的字段除外),因此就数据库本身而言, 任何值都可以。你可能需要调整这个值以确保 Slony-I 等复制系统正常工作—— 如果需要,应该可以从下游复制数据库的状态中获得合适的值。

-n(无操作)开关指示 pg_resetxlog 打印从 pg_control 重构出的值,然后不做任何修改直接退出。 This is mainly a debugging tool, but can be useful as a sanity check before allowing pg_resetxlog to proceed for real.

-V--version 选项打印 pg_resetxlog 的版本并退出。-?--help 选项显示支持的参数,并退出。

注解

服务器正在运行时不得使用这条命令。如果 pg_resetxlog 在数据目录中发现服务器锁文件,它将拒绝启动。如果服务器崩溃过,可能会留下 锁文件;这种情况下你可以删除锁文件以允许 pg_resetxlog 运行。但在这样做之前,请务必再三确认没有仍然存活的服务器进程。

提交更正

译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。