[pgsql-jp: 38305] Re: データの復旧について

TWINS K.Nakase kuni @ twins-comp.com
2007年 4月 11日 (水) 17:11:25 JST


板垣 様

すっかり連絡が遅くなってしまいました。
回答がありがとうございます。

いろいろと右往左往しましたが、
最終的には教えていただいた方法で復旧できました。
ありがとうございました。


宜しくお願い致します。


----- Original Message ----- 
From: "ITAGAKI Takahiro" <itagaki.takahiro @ oss.ntt.co.jp>
To: "PostgreSQL Japanese Mailing List" <pgsql-jp @ ml.postgresql.jp>
Sent: Wednesday, April 04, 2007 10:50 AM
Subject: [pgsql-jp: 38276] Re: データの復旧について


> 板垣です。
>
> "TWINS K.Nakase" <kuni @ twins-comp.com> wrote:
>
>> 登録されているデータに対してDELETE文を実行してしまい大切なデータがほとんど消えてしまいました。 
>> 
>> vacuum処理は実行されていないので、
>> トランザクションファイルに残っているのではないかと思うのですが
>> なんとかこれからデータを復旧させる方法はないでしょうか?
>
> VACUUM していなければ、データベースファイル内に残っている可能性があります。
> トランザクションIDをDELETE 文を発行した時点よりも昔に「巻き戻す」ことで、
> 削除したデータが再び見えるようにできるかもしれません。
> ただし、DELETE 実行前後の多少の操作が失われることは覚悟してください。
>
>
>
> 0. 状況再現
>    # select count(*) from accounts; → 500000
>    # delete from accounts;          → DELETE 500000
>    # select count(*) from accounts; → 0
>
> 1. データベースを停止します。
>   安全のため、ここでバックアップ(ファイルコピー)をしておくのが良いでしょう。
>
> 2. pg_controldata で現在のトランザクションIDを確認します。
>        $ pg_controldata
>        Latest checkpoint's NextXID: 0/74007
>
> 3. pg_resetxlog でトランザクションIDを巻き戻します。
>        $ pg_resetxlog -x 74000 $PGDATA ← 2.で確認したXIDよりも小さな値。
>
> 4. データベースを再起動します。
>
> 5. 確認
>    # select count(*) from accounts; → 500000
>
> 6. うまくいったら、すぐに pg_dump で全データをダンプします。
>   トランザクションを幾つか実行して、ID 削除したトランザクションまで
>   進んでしまうと、再びデータが見えなくなってしまいます。
>
>
> 幸運をお祈りしています ^^
>
>
>
> 




pgsql-jp メーリングリストの案内