geek.conf.2

あるエンジニアの備忘録

pg_rman インストールと設定とリカバリと私

ちす!最近なんやかんや色々ある僕です。
なんだかいつまで同じことをやるのか、やれるのか不安です。プライベートの話ですが。

さて、今日はpg_rmanについてまとめます。
pg_rmanとはPostgreSQL Recovery Managerという意味でOracle RMANみたいなヤツです。
オンラインバックアップ、バックアップの管理(世代管理とかね)、リカバリとかを簡単に実行してくれるツールなんですね。walログも保持・削除してくれるよ。
サポートするPostgreSQLのバージョンは8.4からいけるんじゃないかと思ってるオレ。
今回はPostgreSQL 9系でやるオレ。

【インストール】
まずはPostgreSQL実行ユーザの.bashrcに新しい環境変数を追加してやる。
export BACKUP_PATH=/home/postgres/backup/pg_rman

インストールはrootで行う。

□パスを通す。
# export POSTGRES_HOME=/usr/local/postgres
# export PATH=$POSTGRES_HOME/bin:”$PATH”

コンパイル
# cd /usr/local/src
# tar zxvf pg_rman-1.2.3.tar.gz
# cd pg_rman-1.2.3
# make USE_PGXS=1
# make USE_PGXS=1 install
PGXSというPostgreSQL拡張構築基盤を使用してコンパイルする。

□バックアップ領域を初期化する。
# su – postgres
$ pg_rman init –B $BACKUP_PATH
INFO: ARCLOG_PATH is set to '/usr/local/postgres/archive'
INFO: SRVLOG_PATH is set to '/usr/local/postgres/data/pg_log'

postgres.confから情報は読み取られる。
Postgres.confよりアーカイブログモードの設定を行っておくこと。(archive_modeおよびarchive_command)

□設定ファイルの編集
設定ファイルで定義したものは実際にpg_rmanコマンドを発行する時のオプションに上書きされる。
# vi $BACKUP_PATH/pg_rman.ini

ARCLOG_PATH = /usr/local/postgres/archive・・・walログの場所
#SRVLOG_PATH = /usr/local/postgres/data/pg_log・・・サーバログの場所
BACKUP_MODE = F・・・バックアップモード
COMPRESS_DATA = false・・・zlibによる圧縮モード
KEEP_ARCLOG_FILES = 10・・・walログの保持ファイル数
KEEP_ARCLOG_DAYS = 10・・・walログの保持日数
KEEP_DATA_GENERATIONS = 3・・・バックアップデータの保持する世代数
KEEP_DATA_DAYS = 120・・・バックアップデータの保持日数
#KEEP_SRVLOG_FILES = 10・・・サーバログの保持ファイル数
#KEEP_SRVLOG_DAYS = 10・・・サーバログの保持日数
SMOOTH_CHECKPOINT = YES・・・バックアップ時にチェックポイント作成
#WITH_SERVERLOG = YES・・・サーバログをバックアップ

KEEP_ARCLOG/KEEP_DATA系はいずれかの条件になると適用される。
SMOOTH_CHECKPOINTでバックアップ実行時はチェックポイントを実行してトランザクションをメモリからディスクに吐かそう。
サーバログはsyslogに出力しているので今回はバックアップしない。

□バックアップ実行
(postgresユーザで)
$ pg_rman backup –dbname=postgres –host=localhost –port=5432 –no-password –backup-mode=full

    • no-passwordを使うときはpg_hba.confにてtrustされたユーザで行うこと。

trustされていないと以下のエラーが出る。
ERROR: could not connect to database postgres: fe_sendauth: no password supplied

□バックアップの検証
$ pg_rman validate
validateすることで未検証のバックアップファイルは検証され、不要なものは削除される。

□バックアップカタログの表示
$ pg_rman show

□バックアップカタログのタイムライン表示
$ pg_rman show timeline

□バックアップカタログの詳細表示
$ pg_rman show ‘2012-04-XX 17:15:15’

□バックアップの削除
$pg_rman delete ‘2012-04-XX 17:15:15’
指定したタイムライン以前のバックアップファイルを削除する。

□リカバリ
# /etc/init.d/postgres stop
# rm –rf /usr/local/postgres/data
PostgreSQLを停止してリカバリする。
障害を起こすため、データ領域を削除するよ。

# su - postgres
$ pg_rman restore
WARNING: can't open pg_controldata file "/data/database/global/pg_control": そのようなファイルやディレクトリはありません
INFO: validate: 2012-04-XX 09:39:57 backup and archive log files by SIZE
INFO: restore complete. Recovery starts automatically when the PostgreSQL server is started.


シンボリックリンクとpg_rmanの話
データ領域がシンボリックリンクの場合は注意が必要だ。
例えば
PGDATA=/usr/local/postgres/data --> /data/pgdata
という運用の場合にリストアすると以下のエラーが出てリストア出来ない。
$ pg_rman restore
WARNING: can't open pg_controldata file "/usr/local/pgsql/data/global/pg_control": そのようなファイルやディレクトリはありません
INFO: validate: 2012-04-XX XX:XX:XX backup and archive log files by SIZE
ERROR: can't change directory: そのようなファイルやディレクトリはありません

pg_rmanはまずリンク先の物理的なパス(/data/pgdata)を削除してPGDATA環境変数(/usr/local/postgres/data)であるシンボリックリンクにバックアップをリストアしようとするが、リンク先が削除されているためエラーが出ていると考えられる。
これに対応するためリストア時にpostgresユーザのPGDATA環境変数をリンク先に直してから行う。
さらにシンボリックリンクも削除しておく。
# /etc/init.d/postgres stop
# rm –rf /usr/local/postgres/data
# su – postgres
$ vi /home/postgres/.bashrc
#export PGDATA=/usr/local/postgres/data
export PGDATA=/data/pgdata
$ pg_rman restre
これでリンク先/data/pgdataにリストアされる。
リストア後、/data/databaseにrecovery.confとbackup_labelが作成される。
リストア後、PGDATA環境変数を/usr/local/postgres/dataにしてそのシンボリックリンクを再作成する。
$ cd /usr/local/pgsql
$ ln –s /data/pgdata data
$ exit
# /etc/init.d/postgres start
postgres起動後recovery.confはrecovery.doneに、backup_labelはbackup_label.oldになる。


終わり