[-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 epoch、 下一个多事务ID、下一个多事务偏移量、WAL 起始位置的数值。只有在pg_resetxlog无法通过读取pg_control判断合适的数值的时候才需要它。 安全的数值可以用下面的方法判断:
对于下一个事务ID(-x)而言,一个安全的数值是看看数据目录里的pg_clog里数值最大的文件名, 然后加一,然后再乘上1048576。请注意那些文件名是十六进制的。通常也以十六进制的形式声明开关值是最简单的。 比如,如果0011是pg_clog里最大的记录,-x 0x1200000就可以了(后面的五个零提供了合适的乘积)。
下一个多事务ID(-m)的安全值可以通过查看数据目录里pg_multixact/offsets子目录里面的数字最大的文件名, 加一,然后乘以65536得到。和上面一样,文件名是十六进制的,因此最简单的方法是给开关声明一个十六进制的开关值, 然后在结尾加四个零。
下一个多事务偏移量(-O)的安全值可以通过检查数据目录里pg_multixact/members子目录下的数字最大的文件名, 加一,然后乘以65536得到。和上面一样,文件名是十六进制的,因此最简单的方法是给开关声明一个十六进制的开关值,然后在结尾加四个零。
WAL的起始位置(-l)应该比目前存在于数据目录pg_xlog里面的WAL段任何文件号都大。它的文件名也是十六进制的, 并且有三部分。第一部分是"时间线 ID",通常应该保持相同。第三部分不要选择大于255(0xFF); 应该是在达到255的时候给第二部分增一然后重置第三部分为0。 比如,如果00000001000000320000004A是pg_xlog里最大的条目,那么-l 0x1,0x32,0x4B就可以了; 但如果最大的条目是000000010000003A000000FF,那么选择-l 0x1,0x3B,0x0或更多。
Note: pg_resetxlog本身查看pg_xlog中的文件并选择一个 超越过去的现有文件名字的默认-l设置。因此,-l的手动调节 应该仅在您意识到目前还没出现在pg_xlog中的WAL段文件时才需要, 例如线下文档的条目;或者如pg_xlog的内容已经全部丧失。
没有很容易的办法来判断比数据库中最大的OID大一号的下一个OID, 不过很走运的是获取正确的下一个OID并非非常关键的事情。
除了由pg_resetxlog设定的字段外,事务ID epoch实际上并未存储在数据库里的任何地方。 所以只要是涉及到数据库自身的任何数值都有效。你可能需要调整这个值以确保诸如Slony-I之类的备份系统能够正常工作。 如果是这样的话,应当从下游已复制的数据库中获取恰当的值。
-n(无操作)开关指示pg_resetxlog打印从pg_control重新构造的数值然后不修改任何值就退出。 这主要是一个调试工具,但是在pg_resetxlog真正处理前进行的整洁性检查的时候可能会有用。
-V和--version选项输出pg_resetxlog版本 并退出。选项-?和--help显示支持的参数并退出。