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 和偏移以及 WAL 开始地址域可能还是需要人工协助。这些域可以使用下面讨论的选项设置。如果你不能为所有这些域决定正确的值,-f还是可以被使用,但是恢复的数据库还是值得怀疑:一次立即的转储和重新载入是势在必行的。在你转储之前不要在该数据库中执行任何数据修改操作,因为任何这样的动作都可能使破坏更严重。
-o、-x、-e、 -m、-O和-l选项允许下一个 OID、下一个事务 ID、下一个事务 ID 的纪元、下一个和最老的多事务 ID、下一个多事务偏移量以及 WAL 开始地址值被手动设置。只有当pg_resetxlog没有办法通过读取pg_control决定合适的值时才需要它们。安全值可以按下列方式决定:
下一个事务 ID (-x)的安全值可以通过查看数据目录下pg_clog目录中数字上最大的文件名来决定,把它加一后乘以 1048576。注意文件名是十六进制的。通常最简单的是在选项值中也指定十六进制。例如,如果0011是pg_clog中最大的项,-x 0x1200000就可以(五个结尾零提供了正确的乘数)。
下一个多事务 ID(-m的第一部分)的安全值可以通过查看数据目录下pg_multixact/offsets目录中数字上最大的文件名来决定,把它加一后乘以 65536。相反地,最老的多事务 ID(-m的第二部分)的安全值可以通过查看同一目录下数字上最小的文件名并乘以 65536 来决定。同上,这些文件名是十六进制的,因此最容易的方法是用十六进制指定选项值并且追加四个零。
下一个多事务偏移量(-O)的安全值可以通过查看数据目录下pg_multixact/members目录中数字上最大的文件名来决定,把它加一后乘以 52352。同上,文件名是十六进制的。没有上面那种追加零的简单秘诀。
WAL 开始地址(-l)应该比当前存在于数据目录下pg_xlog目录中的任意 WAL 段文件名更大。这些名称也是十六进制的并且有三个部分。第一部分是"时间线 ID"并且通常应该被保持相同。例如,如果00000001000000320000004A是pg_xlog中最大的项,则使用-l 00000001000000320000004B或更高的值。
Note: pg_resetxlog本身查看pg_xlog中的文件并选择一个超出最新现存文件名的默认-l设置。因此,只有当你知道 WAL 段文件当前不在pg_xlog中时,或者当pg_xlog的内容完全丢失时,才需要对-l的手工调整,例如一个离线归档中的项。
没有相对容易的方法来决定超过数据库中最大 OID 的下一个 OID。但幸运的是正确地得到下一个 OID 设置并不是决定性的。
事务 ID 纪元实际上并没有被存储在数据库中的任何地方,除了被pg_resetxlog设置的域,因此就数据库本身而言任意值都能工作。你可能需要调整这个值来确保复制系统(如Slony-I)正确工作 — 如果这样,应该能从下游复制的数据库的状态得到一个合适的值。
-n(无操作)选项指示pg_resetxlog打印从pg_control重构的值以及即将要被改变的值,然后退出并且不修改任何东西。这主要是一种调试工具,但是有助于在让pg_resetxlog真正继续下去之前作为一种完整性检查。
-V和--version选项打印pg_resetxlog版本并退出。选项-?和--help显示支持的参数并退出。