pg_resetxlog
pg_resetxlog — 重置一个 PostgreSQL 数据库集簇的事务日志及其他控制信息
大纲
pg_resetxlog [-f] [-n] [option...] {[-D] datadir}
描述
pg_resetxlog 清空事务日志(WAL),并有选择地重置
pg_control 文件中存储的一些其他控制信息。当这些文件损坏时,有时就需要这项功能。它应当只作为最后的手段使用,即当服务器因这种损坏而无法启动时。
运行这条命令之后,应当就能启动服务器了,但请记住,由于部分提交的事务,数据库中可能包含不一致的数据。你应当立即转储数据、运行 initdb
并重新装载。重新装载之后,检查不一致之处并按需修复。
这个工具只能由安装服务器的用户运行,因为它需要对数据目录的读写访问权限。出于安全原因,你必须在命令行上指定数据目录。pg_resetxlog
不使用环境变量 PGDATA。
如果 pg_resetxlog 抱怨说无法确定 pg_control
的有效数据,你可以通过指定 -f(强制)选项迫使它继续执行。在这种情况下,缺失的数据会用貌似合理的值代替。大多数字段都可以期望是匹配的,但下一个 OID、下一个事务 ID 及其纪元、下一个多事务 ID 及偏移量、WAL 起始地址这些字段可能需要人工协助。这些字段可以用下面讨论的选项来设置。如果你无法为所有这些字段确定正确的值,仍可以使用 -f,但恢复出的数据库必须受到比平常更多的怀疑:必须立即转储并重新装载。在转储之前不要在数据库中执行任何修改数据的操作,因为任何此类操作都很可能使损坏加剧。
选项
-f即使
pg_resetxlog无法确定pg_control的有效数据,也强制它继续执行,如上文所述。-n-n(不操作)选项指示pg_resetxlog打印从pg_control重建的值以及即将更改的值,然后不做任何修改直接退出。这主要是一种调试工具,但在真正让pg_resetxlog执行之前,也可以用作健全性检查。-V--version显示版本信息然后退出。
-?--help显示帮助然后退出。
只有当 pg_resetxlog 无法通过读取 pg_control
确定合适的值时,才需要下列选项。安全值可以按下述方法确定。对于接受数值参数的选项,可以使用前缀 0x 指定十六进制值。
-cxid,xid手动设置可检索提交时间的最旧和最新事务 ID。
可检索提交时间的最旧事务 ID 的安全值(第一部分)可以通过在数据目录下的
pg_commit_ts目录中查找数值最小的文件名来确定。反之,可检索提交时间的最新事务 ID 的安全值(第二部分)可以通过在同一目录中查找数值最大的文件名来确定。文件名为十六进制。-exid_epoch手动设置下一个事务 ID 的纪元。
事务 ID 纪元实际上并不存储在数据库中的任何地方(由
pg_resetxlog设置的字段除外),因此就数据库本身而言,任何值都可以。你可能需要调整这个值以确保 Slony-I 和 Skytools 等复制系统正常工作—— 如果需要,应该可以从下游复制数据库的状态中获得合适的值。-lxlogfile手动设置 WAL 起始地址。
WAL 起始地址应当大于数据目录下
pg_xlog目录中现存的任何 WAL 段文件名。这些名称同样是十六进制的,并且分为三部分。第一部分是“时间线 ID”,通常应保持不变。例如,如果00000001000000320000004A是pg_xlog中最大的项,则使用-l 00000001000000320000004B或更高的值。注意
pg_resetxlog本身会查看pg_xlog中的文件,并选择一个超出最后一个现存文件名的默认-l设置。因此,只有当你知道存在当前不在pg_xlog中的 WAL 段文件(例如离线归档中的条目),或者pg_xlog的内容已完全丢失时,才需要手动调整-l。-mmxid,mxid手动设置下一个和最旧的多事务 ID。
下一个多事务 ID 的安全值(第一部分)可以通过在数据目录下的
pg_multixact/offsets目录中查找数值最大的文件名、加一、再乘以 65536(0x10000)来确定。反之,最旧多事务 ID 的安全值(-m的第二部分)可以通过在同一目录中查找数值最小的文件名再乘以 65536 来确定。文件名为十六进制,因此最简单的做法是用十六进制指定选项值并追加四个零。-ooid手动设置下一个 OID。
没有同样简单的方法来确定一个超出数据库中最大 OID 的下一个 OID,但幸运的是,下一个 OID 设置得是否正确并不关键。
-Omxoff手动设置下一个多事务偏移量。
安全值可以通过在数据目录下的
pg_multixact/members目录中查找数值最大的文件名、加一、再乘以 52352(0xCC80)来确定。文件名为十六进制。这里没有像其他选项那样追加零的简单方法。-uxid手动设置最旧的未冻结事务 ID。
安全值可以通过在数据目录下的
pg_xact目录中查找数值最小的文件名再乘以 1048576(0x100000)来确定。注意文件名为十六进制。通常最简单的做法是用十六进制指定选项值。例如,如果0007是pg_xact中最小的项,则-u 0x700000可行(五个尾随零提供正确的乘数)。-xxid手动设置下一个事务 ID。
安全值可以通过在数据目录下的
pg_clog目录中查找数值最大的文件名、加一、再乘以 1048576(0x100000)来确定。注意文件名为十六进制。通常最简单的做法是用十六进制指定选项值。例如,如果0011是pg_clog中最大的项,则-x 0x1200000可行(五个尾随零提供正确的乘数)。
注解
服务器正在运行时不得使用这条命令。如果 pg_resetxlog
在数据目录中发现服务器锁文件,它将拒绝启动。如果服务器崩溃过,可能会留下锁文件;这种情况下你可以删除锁文件以允许 pg_resetxlog
运行。但在这样做之前,请务必再三确认没有仍然存活的服务器进程。
pg_resetxlog 只能用于同一大版本的服务器。