PG_RESETXLOG(1)

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

SYNOPSIS

pg_resetxlog [ -f ] [ -n ] [ -o oid ] [ -x xid ] [ -l fileid,seg ] datadir

DESCRIPTION 描述

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

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

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

如果 pg_resetxlog 抱怨说它无法判断用于 pg_control 的有效数据，那么你可以强制它继续处理， 方法是声明 -f （强制）开关。在这种情况下，那些丢失了的数据的值将用模糊的近似数值代替。 大多数字段都可以匹配上，但是下一个 OID，下一个事务 ID，WAL 开始地址以及数据库区域字段可能需要手工帮助， 前面三个可以用下面讨论的开关设置。pg_resetxlog 自己的环境是猜测区域字段的来源；看看 LANG 等等东西，它们应该和 initdb 运行的环境相匹配。 如果你不能判断所有这些字段的正确数值，那么还是可以使用 -f， 但是这样恢复过来的数据库更要怀疑有问题：立即转储和重置是必须的。 在转储之前不要执行任何修改数据的操作，因为任何这样的动作都可能把事情搞得更糟糕。

 -o, -x, 和 -l 开关允许我们手工设置下一个 OID，下一个事务 ID，以及 WAL 起始位置的数值。 只有在 pg_resetxlog 无法通过读取 pg_control 判断合适的数值的时候才需要它。对于下一个事务 ID 而言，一个安全的数值是看看数据目录里的 /pg_clog 里数值最大的文件名， 然后加一，然后再乘上 1048576。请注意那些文件名是十六进制的。通常我们也以十六进制的形式声明开关值是最简单得。 比如，如果 0011 是 pg_clog 里 最大的记录，-x 0x1200000 就可以了（后面的五个零提供了合适的乘积）。 WAL 的起始位置应该比目前存在于数据目录里得 /pg_xlog 里面的任何文件号都大。它也是十六进制的，并且有两部分。比如，如果 000000FF0000003A 是 pg_xlog 里最大的条目， 那么-l 0xFF,0x3B 就可以了。我们没有很容易的办法来判断比数据库中最大的 OID 大一号的下一个 OID， 不过很走运的是获取正确的下一个 OID 并非非常关键。

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

NOTES 注意

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

译者
Postgresql 中文网站 何伟平 <laser@pgsqldb.org>