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



バックアップ

バックアップ要件

  • バックアップ要件は下記を前提として設定を行います。
・オンラインで全データベースをバックアップする
pg_dumpallコマンドを利用
・定期バックアップ(1日1回)
cronを利用
・バックアップは3世代を管理する
logrotateを利用

バックアップの設定

  • 定期バックアップはcronを利用します。
    今回は毎日2時にバックアップするよう「crontab -e」コマンドで設定します。
    # su postgres
    $ crontab -e
    0 2 * * *  pg_dumpall -c > /var/lib/pgsql/backups/db.dump

  • 世代管理はlogrotateを利用します。
    設定ファイル「/etc/logrotate.d/postgres_backup」を下記内容で新規作成します。
    /var/lib/pgsql/backups/db.dump{
        daily
        missingok
        notifempty
        rotate 3
    }
・daily
毎日実行する
・missingok
ファイルが無くてもエラーを出さない
・notifempty
ファイルが空なら実行しない
・rotate 10
10世代残す

  • logrotate の確認を行います。
    # logrotate -dv /etc/logrotate.d/postgres_backup
    reading config file /etc/logrotate.d/postgres_backup
    reading config info for /var/lib/pgsql/backups/db.dump
    
    Handling 1 logs
    
    rotating pattern: /var/lib/pgsql/backups/db.dump  after 1 days (3 rotations)
    empty log files are not rotated, old logs are removed
    considering log /var/lib/pgsql/backups/db.dump
      log /var/lib/pgsql/backups/db.dump does not exist -- skipping

    構文エラーの場合は下記のようなエラーがでます。
    error: /etc/logrotate.d/postgres_backup:2 unexpected text

リカバリ

サンプルデータの登録

  • pg_dumpの動作確認用データとして現在の時間を登録します。
    $ 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)

リカバリ作業

  • Postgresを停止
    $ pg_ctl stop

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

  • Postgresを起動
    $ pg_ctl start

  • データベースを削除
    $ dropdb testdb
    DROP DATABASE
  • データベースを作成
    $ createdb testdb
    CREATE DATABASE
  • データリストア
    $ psql -e testdb < /var/lib/pgsql/backups/db.dump

復旧確認

  • testdbへ接続しリストアの確認を行います。
    $ 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
     2009-08-23 04:41:03.844767
    (9 rows)

トップ   差分 バックアップ リロード   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2010-09-06 (月) 01:36:19 (9h)