zoukankan      html  css  js  c++  java
  • pg_resetxlog

    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或者后端服务器仍在运行。  

  • 相关阅读:
    三次请求(读-改-读)引出nibernate 一级缓存
    算法竞赛入门经典第一、二章摘记
    uva 10905 Children's Game
    uva 11205 The broken pedometer
    uva 10160 Servicing stations
    uva 208 Firetruck
    uva 167 The Sultan's Successors
    zoj 1016 Parencodings
    uva 307 Sticks
    uva 216 Getting in Line
  • 原文地址:https://www.cnblogs.com/fanweisheng/p/11097497.html
Copyright © 2011-2022 走看看