pg_resetxlog

名称

pg_resetxlog -- 重置一个数据库集群的预写日志以及其它控制内容

大纲

pg_resetxlog [-f] [-n] [-o oid] [-x xid] [-e xid_epoch] [-m mxid,mxid] [-O mxoff] [-l xlogfile] datadir

描述

pg_resetxlog清理预写日志(WAL)并且可以有选择地重置其它一些存储在 pg_control文件中的控制信息。有时候,如果这些文件崩溃了,就需要这个功能。 一定只把它用作最后的方法,就是说只有因为这样的崩溃导致服务器无法启动的时候才使用。

运行这个命令之后,可能就可以启动服务器了,但是, 一定要记住数据库可能因为部分提交的事务而含有不完整的数据。你应该马上转储数据, 运行initdb,然后重新加载。在重新加载之后, 检查不完整的部分然后根据需要进行修复。

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

如果pg_resetxlog抱怨说它无法判断用于pg_control 的有效数据,那么你可以强制它继续处理,方法是声明-f(强制)开关。 在这种情况下,那些丢失了的数据将用模糊的近似数值代替。大多数字段都可以匹配上, 但是下一个 OID 、下一个事务 ID 、下一个事务 ID 的 epoch(时间点)、 下一个多事务 ID(两阶段提交的东西)、下一个多事务偏移量、WAL 开始地址可能需要手工帮助, 这些字段可以使用下面讨论的选项设置。如果你不能判断所有这些字段的正确数值, 那么-f仍然可以使用,但是这样恢复过来的数据库正确性更值得怀疑: 立即转储和重新加载是必须的。在转储之前不要执行任何修改数据的操作, 因为任何这样的动作都可能把事情搞得更糟糕。

-o, -x, -e, -m, -O, -l 开关允许手工设置下一个 OID 、下一个事务 ID 、下一个事务 ID epoch 、 下一个和最旧的多事务 ID 、下一个多事务偏移量、WAL 起始位置的数值。 只有在pg_resetxlog无法通过读取pg_control 判断合适的数值的时候才需要它。安全的数值可以用下面的方法判断:

-n(无操作)选项指示pg_resetxlog打印从 pg_control重新构造的数值然后不修改任何值就退出。这主要是一个调试工具, 但是在pg_resetxlog真正处理前进行的合理性检查的时候可能会有用。

-V--version选项打印pg_resetxlog 的版本然后退出。选项-?--help显示参数的支持信息然后退出。

注意

在服务器运行的时候一定不要运行这个命令。如果发现在数据文件目录里有锁文件, 那么pg_resetxlog将拒绝启动。如果服务器崩溃, 那么可能会留下一个锁文件;如果这样,你可以删除该锁文件以便允许 pg_resetxlog运行。但是在你这么做之前, 一定要确保没有任何后端服务器进程仍在运行。