>> HOME >> FC5 MENU >> PostgreSQL でオンラインバックアップ (pg_dump)
PostgreSQL データベースのオンラインバックアップを行ないます。
ここでは、pg_dump を用い、PostgreSQL の個々のデータベースをサーバー内の別ディレクトリへバックアップします。
pg_dump は PostgreSQL のバックアップ専用ツールです。データベース単位だけでなく、テーブル単位のバックアップも取得できます。pg_dump は標準でスキーマ定義やユーザー定義関数も含めてバックアップします。

※ 全ての作業は PostgreSQL 管理ユーザー ( postgres ) で行います。

1. PostgreSQL のオンラインバックアップの設定
 1 ) バックアップ先ディレクトリの作成
 2 ) バックアップスクリプトの作成
 3 ) スケジューラ(cron)への登録
2. PostgreSQL のリストア方法
3. その他のバックアップ・リストア方法 ( pg_dumpall )
1. PostgreSQL のオンラインバックアップの設定
1 ) バックアップ先ディレクトリの作成
[root@linux ~]# mkdir -p /work/backup/pgsql 

[root@linux ~]# chown postgres:postgres /work/backup/pgsql 

[root@linux ~]# chmod 755 /work/backup/pgsql 
2 ) バックアップスクリプトの作成
[root@linux ~]# su - postgres 

-bash-3.1$ vi pgsql-backup.sh 

#!/bin/sh

# 日付文字列
DATE=`date "+%Y%m%d"`
# パスの設定
PATH=/usr/local/sbin:/usr/bin:/bin
# バックアップDB
DB_NAME=testdb
# バックアップ先ディレクトリ
BKUP_DIR=/work/backup/pgsql

# testdbデータベースバックアップ
pg_dump -D DB_NAME > $BKUP_DIR/$DB_NAME_$DATE


-bash-3.1$ chmod 700 pgsql-backup.sh 
3 ) スケジューラ(cron)への登録
-bash-3.1$ crontab -e 

# 毎日 00:00 に自動実行します。
00 00 * * * /var/lib/pgsql/pgsql-backup.sh > /dev/null 2>&1
2. PostgreSQL のリストア方法
ここでは、testdb データベースをリストアします。
※ testdb データベースは上の方法で既にバックアップが取られているものとします。
[root@linux ~]# psql testdb < /work/backup/pgsql/testdb_20060725 
リストアを実行する前に、対象のデータベースはもちろん、ダンプされたデータベース内のオブジェクトを所有するユーザーや、そのオブジェクト上に権限を与えられたユーザーも存在していなければなりません。
3. その他のバックアップ・リストア方法 ( pg_dumpall )
上記で説明した手法では、データベースクラスタ全体をバックアップする際に扱いにくく不適切です。この理由で、pg_dumpall が提供されています。pg_dumpall は指定されたクラスタの各データベースのバックアップを行い、そして、ユーザーやグループなどのクラスタ全体にわたるデータを保持します。
このコマンドの基本的な使用法は
pg_dumpall > outfile
です。ダンプの結果は psql でリストアできます。
psql template1 < infile
リストア時に任意の既存データベース名を指定可能ですが、空のクラスタ内にリストアする場合は、template1 が唯一の選択肢です。なお、リストア時には、PostgreSQL 管理ユーザー ( postgres ) での実行が必要です。

ということで、これらを踏まえ、先に作成した pgsql-backup.sh を変更し、1週間に一度 pg_dumpall を実行するようにします。
-bash-3.1$ vi pgsql-backup.sh 

#!/bin/sh

# 日付文字列
DATE=`date "+%Y%m%d"`
# 曜日
WEEK=`date "+%w"`
# パスの設定
PATH=/usr/local/sbin:/usr/bin:/bin
# バックアップDB
DB_NAME=testdb
# バックアップ先ディレクトリ
BKUP_DIR=/work/backup/pgsql

# 日曜日 ( date "+%w" が "0" ) だったら、データベースクラスタ全体バックアップ
if [ "$WEEK" = "0" ]; then
    # データベースクラスタ全体バックアップ
    pg_dumpall > $BKUP_DIR/all_$DATE
else
    # testdbデータベースバックアップ
    pg_dump -D DB_NAME > $BKUP_DIR/$DB_NAME_$DATE
fi