PITRによるバックアップ・リカバリ



はじめに

PITR設定

postgresql.confの編集

  • pg_xlogディレクトリ配下のWAL(トランザクションログ)をアーカイブログとして保存するよう設定します。
    PITRを有効にするにはこの設定が必須です。
    $ vi /var/lib/pgsql/data/postgresql.conf
    
     archive_mode = on          # バージョン8.2以降のみ設定する
     archive_command = 'cp "%p" /var/lib/pgsql/archive/"%f"'
・%P
WAL(トランザクションログ)ファイルのフルパス名
・%f
WAL(トランザクションログ)ファイルのファイル名
  • 設定を変更したのでPostgreSQLを再起動します。
    $ pg_ctl restart
  • 最後にアーカイブログ用のディレクトリを作成します。
    $ mkdir /var/lib/pgsql/archive

動作確認

バックアップ

チェックポイントの作成

 pg_start_backup(),pg_stop_backup()を利用してチェックポイントを作成します。

  • データベース「template1」へ接続します。
    $ psql template1

  • pg_start_backup()によりバックアップの開始を宣言します。
    template1=# select pg_start_backup('/var/lib/pgsql/archive/base_bak');

  • データベースクラスタをコピーします。この時、データベースを停止する必要はありません。
    template1=# \!cp -rp /var/lib/pgsql/data /var/lib/pgsql/archive/base_bak

  • pg_stop_backup()によりバックアップの終了を宣言します。(履歴ファイルがWAL保管領域に保存されます)
    template1=# select pg_stop_backup();
     pg_stop_backup
    ----------------
     0/3ED6B4
    (1 row)

サンプルデータの登録

  • PITRの動作確認用のDBを作成して、データとして現在の時間を登録します。
    $ createdb testdb
    $ psql testdb
    
    testdb=# CREATE TABLE t_test(time timestamp); testdb=# INSERT INTO t_test VALUES(now());
    testdb=# SELECT * from t_test;
                time
    ----------------------------
     2009-08-23 04:39:12.9077
     2009-08-23 04:39:13.338911
     2009-08-23 04:39:13.500074
     2009-08-23 04:39:13.60608
     2009-08-23 04:39:13.70793
     2009-08-23 04:39:13.897418
     2009-08-23 04:39:14.095757
     2009-08-23 04:39:25.773003
     2009-08-23 04:41:03.844767
    (9 rows)

リカバリ

リカバリ作業

「2009-08-23 04:40:00」の時点にリカバリします。

  • Postgresを停止
    $ pg_ctl stop

  • データベースディレクトリを退避
    $ mv /var/lib/pgsql/data /var/lib/pgsql/data_old

  • ベースバックアップからデータベースディレクトリを復元
    $ cp -rp /var/lib/pgsql/archive/base_bak /var/lib/pgsql/data

  • pg_xlogを削除
    $ rm -rf /var/lib/pgsql/data/pg_xlog

  • 最新のpg_xlogを取得
    $ cp -rp /var/lib/pgsql/data_old/pg_xlog /var/lib/pgsql/data/pg_xlog

  • リカバリ用の設定ファイル(サンプル)をコピーします。
    $ cp /usr/share/pgsql/recovery.conf.sample /var/lib/pgsql/data/recovery.conf

  • リカバリ用の設定ファイル「/var/lib/pgsql/data/recovery.conf」を編集します。
    #実行コマンド
    restore_command = 'cp /var/lib/pgsql/archive/%f %p'
    
    #戻したい時間を指定。無ければ指定しない。
    recovery_target_time = '2009-08-23 04:40:00 JST'

  • Postgres起動
    $ pg_ctl -w start

復旧確認

  • testdbへ接続し、recovery_target_timeで指定した時間に戻っている事を確認します。
    $ psql testdb
    
    testdb=# SELECT * from t_test;
               time
    ----------------------------
     2009-08-23 04:39:12.9077
     2009-08-23 04:39:13.338911
     2009-08-23 04:39:13.500074
     2009-08-23 04:39:13.60608
     2009-08-23 04:39:13.70793
     2009-08-23 04:39:13.897418
     2009-08-23 04:39:14.095757
     2009-08-23 04:39:25.773003
    (8 rows)

定期バックアップの設定

シェルスクリプトの作成

  • PITR用のバックアップスクリプトを作成します。
    $ vi /var/lib/pgsql/db_backup.sh
    
    #!/bin/sh
    
    SQL="SELECT usename FROM pg_user where usename = 'postgres'"
    psql -d template1 -c "$SQL" > /dev/null 2>&1
    if [ $? -ne 0 ]
    then
        exit
    else
        rm -rf /var/lib/pgsql/archive_old
        mv /var/lib/pgsql/archive  /var/lib/pgsql/archive_old
        mkdir /var/lib/pgsql/archive
        psql -d template1 -c "select pg_start_backup('/var/lib/pgsql/archive/base_bak');"
        cp -rp /var/lib/pgsql/data /var/lib/pgsql/archive/base_`date +%Y%m%d`
        psql -d template1 -c "select pg_stop_backup();"
    fi
    
  • スクリプトに実行権限を付与します。
    $ chmod +x db_backup.sh
    

cronの設定

  • スクリプトをpostgresユーザのcronに設定します。
    # crontab -e
    0 3 * * 0   /var/lib/pgsql/db_backup.sh
トップ   差分 バックアップ リロード   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2010-09-06 (月) 01:36:11 (8h)