pg_resetxlog

Name

pg_resetxlog -- 重置一个PostgreSQL数据库集簇的预写式日志以及其他控制信息

Synopsis

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决定合适的值时才需要它们。安全值可以按下列方式决定:

-n(无操作)选项指示pg_resetxlog打印从pg_control重构的值以及即将要被改变的值,然后退出并且不修改任何东西。这主要是一种调试工具,但是有助于在让pg_resetxlog真正继续下去之前作为一种完整性检查。

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

注解

这个命令不能在服务器正在运行时被使用。如果在数据目录中发现一个服务器锁文件,pg_resetxlog将拒绝启动。如果服务器崩溃那么一个锁文件可能会被留下,在那种情况下你能移除该锁文件来让pg_resetxlog运行。但是在你那样做之前,再次确认没有服务器进程仍然存活。