pg_resetxlog – 重置一个 PostgreSQL 数据库集羣的预写日志以及其它控制内容
注意从pg 10开始 pg_resetxlog 被 pg_resetwal 替代
root@vultr:/usr/lib/postgresql/10/bin# ./pg_resetwal --help pg_resetwal resets the PostgreSQL write-ahead log. Usage: pg_resetwal [OPTION]... DATADIR Options: -c XID,XID set oldest and newest transactions bearing commit timestamp (zero in either value means no change) [-D] DATADIR data directory -e XIDEPOCH set next transaction ID epoch -f force update to be done -l WALFILE force minimum WAL starting location for new write-ahead log -m MXID,MXID set next and oldest multitransaction ID -n no update, just show what would be done (for testing) -o OID set next OID -O OFFSET set next multitransaction offset -V, --version output version information, then exit -x XID set next transaction ID -?, --help show this help, then exit Report bugs to <pgsql-bugs@postgresql.org>.
pg_resetxlog [ -f ] [ -n ] [ -o oid ] [ -x xid ] [ -l fileid,seg ] datadir
清理预写日志(WAL)并且可以选择地重置其它一些控制信息(存储在 pg_control文件中)。
有时候,如果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真正处理前进行的整洁性检查的时候可能会有用。
在 postmaster 服务器运行的时候一定不要运行这个命令。
如果发现在数据文件目录里有锁文件,那麽 pg_resetxlog 将拒绝啓动。如果 postmaster崩溃,那麽可能会剩下一个锁文件;
如果这样,你可以删除该锁文件以便允许pg_resetxlog运行。但是在你这麽做之前,一定要确信没有任何postmaster或者后端服务器仍在运行。
Comment