pg_rmanを使ってPostgreSQLを別サーバーにバックアップ

PostgreSQLのバックアップに便利な方法はないものかと、試しにpg_rmanをコンパイル、インストール、設定したときのメモ。環境はCentOS5

pg_rmanはPostgreSQLのデータを簡単なコマンドでバックアップ・リストアできるツール。ダウンロードはGoogle Codeのプロジェクトページから。

インストールの方法は公式のwikiにもあるし、ここのサイトも分かりやすい。

以下自分でやったコマンドのメモ。pg_configにパスが通ってないとダメらしいので、パスの追記から。

# vi ./.bashrc
PATH=/usr/local/pgsql/bin:$PATH
export PATH
# source ./.bashrc

もしくはPostgreSQLがインストールされた場所に書き込み権限があればいいので、postgresをownerにする。
# chown postgres. -R /usr/local/pgsql
# su postgres

コンパイルしてインストール。

# tar xzvf pg_rman-1.1.2.tar.gz
# cd pg_rman 
# make USE_PGXS=1
# make USE_PGXS=1 install

環境変数を設定

# su postgres
$ cd
$ vi ./.bashrc
export PGDATA=/usr/local/pgsql/data
export BACKUP_PATH=/mnt/backup/pgsql
$ source ./.bashrc

環境変数が設定できたかどうか確認
$ echo $BACKUP_PATH

pg_rmanを初期化
$ pg_rman init -B  $BACKUP_PATH

WARNING: ARCLOG_PATH is not set because archive_command is empty
INFO: SRVLOG_PATH is set to '/usr/local/pgsql/data/pg_log'

archive_mode=offだとWARNINGが出るみたい。postgresql.confを編集。pg_logディレクトリも作ってログの設定もする。

$ mkdir /usr/local/pgsql/data/pg_log
$ vi /usr/local/pgsql/data/postgresql.conf

archive_mode = on
archive_command = 'cp %p /usr/local/pgsql/data/pg_archive/%f'

log_destination = 'stderr'
logging_collector = on
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'
log_truncate_on_rotation = off
log_rotation_age = 1d
log_rotation_size = 10MB

再起動してもう一度やってみる。
$ exit
# /etc/rc.d/init.d/postgresql restart
# su postgres
$ pg_rman init -B  $BACKUP_PATH

INFO: ARCLOG_PATH is set to '/usr/local/pgsql/data/pg_archive'
INFO: SRVLOG_PATH is set to '/usr/local/pgsql/data/pg_log'

試しに全体バックアップをとってみる。
$ pg_rman backup --backup-mode=full --with-serverlog

INFO: database backup start
NOTICE:  pg_stop_backup complete, all required WAL segments have been archived

検証
$ pg_rman validate

INFO: validate: 2010-11-26 13:22:35

バックアップ一覧表示
$ pg_rman show

大丈夫みたい。

次にcronで定期実行するためにpg_rman設定ファイルにオプションを追記
$ vi /mnt/backup/pgsql/pg_rmain.ini

ARCLOG_PATH='/usr/local/pgsql/data/pg_archive'
SRVLOG_PATH='/usr/local/pgsql/data/pg_log'

BACKUP_MODE = F
COMPRESS_DATA = YES
KEEP_ARCLOG_FILES = 10
KEEP_ARCLOG_DAYS = 10
KEEP_DATA_GENERATIONS = 3
KEEP_DATA_DAYS = 120
KEEP_SRVLOG_FILES = 10
KEEP_SRVLOG_DAYS = 10

cronの設定
$ exit
# vi /etc/cron.d/postgresql

MAILTO=""

0 4 * * * postgres source /home/postgres/.bashrc; /usr/local/pgsql/bin/pg_rman backup; /usr/local/pgsql/bin/pg_rman validate

4:00にpostgresの環境変数を読み込んでバックアップ+検証を実行する。cronのログは/var/log/cronに出力される。

その他、ネットワーク上の別サーバーにバックアップを取りたい場合はNFSを使ってマウントするのが簡単。前の記事を参考に。

 

<関連記事>

【Linux】NFSv4を使ってサーバー間で共有フォルダをmountする
【PostgreSQL】pgpool-Ⅱでレプリケーション、インストールと設定
【Linux】PostgreSQL 8.3.3のコンパイル→インストール→設定