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


Table of Contents

↑

はじめに

PITRによるオンラインバックアップ・リカバリの参考手順です。

  • 前提
    • PostgreSQLは8.4を想定しています。
    • PostgreSQLのインストールについては以下を参照して下さい。
      PostgreSQL 8.4
↑

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(now()::text);

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

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

↑

サンプルデータの登録

  • PITRの動作確認用のDBを作成して、データとして現在の時間を登録します。
↑

リカバリ

↑

リカバリ作業

  • Postgresを停止
    $ pg_ctl stop

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

  • ベースバックアップからデータベースディレクトリを復元
    $ 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_org/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」を編集します。
  • Postgres起動
    $ pg_ctl -w start

↑

復旧確認

  • testdbへ接続し、recovery_target_timeで指定した時間に戻っている事を確認します。
↑

定期バックアップの設定

↑

シェルスクリプトの作成

  • PITR用のバックアップスクリプトを作成します。
    $ vi /var/lib/pgsql/db_backup.sh#!/bin/shSQL="SELECT usename FROM pg_user where usename = 'postgres'"# postgresユーザの存在確認psql -d template1 -c "$SQL" > /dev/null 2>&1if [ $? -ne 0 ]then    exitelse    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 -e0 3 * * 0   /var/lib/pgsql/db_backup.sh
このエントリーをはてなブックマークに追加
Last-modified: 2010-06-05 (土) 12:30:45   最終更新のRSS