PITR を PostgreSQL 8.3.5文書 通り試してみました

とりあえず、てきとうな DB を作成するところから

$ createdb -E EUC_JP testdb
$ psql testdb

testdb=# create table hoge (
testdb(# id int primary key,
testdb(# name text
testdb(# );

ここらへんでベースバックアップを作成

ある時期のpgsql/data の状態がないと、REDO な操作しか受け付けないから復旧できない

理屈的には、インストールした状態のベースバックアップがあれば REDO できる?(あとで試す)

ベースバックアップモードへの以降(とりあえずのチェックポイント作成とバックアップラベルファイルの生成)

  • (他にもいろいろやってる?後で追求)

testdb=# select pg_start_backup('test1');
pg_start_backup

                                • -

0/45F214
(1 row)

別ターミナルでバックアップの取得

# cp -pR /usr/local/pgsql/data /usr/local/pgsql/data_backup

ベースバックアップモードの終了

testdb=# select pg_stop_backup();
pg_stop_backup

                              • -

0/45F270
(1 row)

別ターミナルで、一応アーカイブログがあるか確認

# ll /mnt/server/archivedir/
total 16408

  • rw------- 1 postgres postgres 16777216 Feb 19 04:30 000000010000000000000000
  • rw------- 1 postgres postgres 235 Feb 19 04:30 000000010000000000000000.0045F214.backup

テーブルにテストデータを挿入

testdb=# insert into hoge values (1, 'TOYO');
INSERT 0 1
testdb=# insert into hoge values (2, 'グランパ');
INSERT 0 1
testdb=# insert into hoge values (3, '国際センター');
INSERT 0 1

あっ、まちがえて、delete from hoge して、テーブル hoge の中身が全部消えちゃった!

  • とりあえず時刻の確認(別ターミナル)

# date
Thu Feb 19 04:35:24 JST 2009

    • delete !!!

testdb=# delete from hoge;

復旧開始、まず postgres の停止

# service postgres stop

pg_xlog の退避

# cd /usr/local/pgsql/data
# cp -pR pg_xlog /tmp/pg_xlog

ベースバックアップの状態まで復元

# cd ..
# rm -rf data
# mv data_backup data

pg_xlog の復元

pg_xlog の中身をすべて削除して

# find pg_xlog/ -type f | xargs rm -f

退避しておいたファイルをコピー

# cp -pR /tmp/pg_xlog ./

recovery.conf の作成

# cp ../share/recovery.conf.sample ./recovery.conf

recovery.conf の編集(以下 2行のみコメントアウトを解除して編集)

restore_command = 'cp /mnt/server/archivedir/%f %p'
recovery_target_time = '2009-02-19 04:35:23 JST'

サーバの起動

# service postgres start

以上で、delete した直前の状態まで復旧完了。