pg_rman -- PostgreSQL のバックアップとリカバリを管理します。
pg_rman [ OPTIONS ] { init | backup | restore | show [ DATE | timeline ] | validate [ DATE ] | delete DATE }
pg_rman は以下の機能を持ちます。
DATE
には、対象のバックアップのタイムスタンプ (開始日時) を ISO 形式 (YYYY-MM-DD HH:MI:SS) で指定します。DATE
の末尾は省略可能で、その場合は指定した DATE
の範囲に含まれるバックアップが対象となります。
$ pg_rman show 2009-12 # 2009年12月に取得したバックアップを表示
$ pg_rman validate # 未検証のすべてのバックアップを検証
以下のコマンドをサポートします。オプション OPTIONS
の詳細は オプション を参照してください。
init
backup
restore
show
timeline
を指定すると、バックアップのタイムラインとその親タイムラインを表示します。validate
delete
pg_rman は、PostgreSQL のオンライン・バックアップとリカバリを管理するためのプログラムです。 バックアップ方式は、物理オンライン・バックアップです。 バックアップ対象は、データベースクラスタ自体とアーカイブ WAL、サーバログです。
PostgreSQL 9.0以降のレプリケーションを利用している場合、スタンバイサイトでのバックアップに対応しています。
その他、ストレージ・スナップショットを使用したバックアップに対応しています。
pg_rman は、取得したバックアップファイルや管理情報を「バックアップカタログ」という領域に保存します。 このため、まず最初にバックアップカタログを初期化する必要があります。
$ pg_rman init -B <バックアップカタログパス> -D <PostgreSQLのデータベースクラスタパス> -A <アーカイブログの格納パス>
ここで、カタログを初期化する前に postgresql.conf にある log_directory
、archive_mode
、archive_command
を設定しておくことをお奨めします。
これらのパラメータが設定されていると、pg_rman はその値を反映してサーバログの参照先とアーカイブログの参照先を設定することができます。
この場合、PostgreSQL のデータベースクラスタパスを指定する必要があります。
バックアップのモードは以下のいずれかで指定します。
取得したバックアップが適切かどうか検証します。検証にはファイルサイズのチェックとCRCによるチェックを用いています。
バックアップが正常に取得できたら、なるべく早いタイミングでバックアップを検証してください。 未検証のバックアップは、リストアにも増分バックアップの取得基準としても使用できません。
取得したバックアップは show
コマンドにて確認できます。
$ pg_rman show
============================================================================
Start Time Total Data WAL Log Backup Status
============================================================================
2015-03-10 13:26:37 0m ---- ---- 16MB ---- 26kB OK
2015-03-10 13:26:06 0m ---- 16kB 33MB ---- 54kB OK
2015-03-10 13:25:05 0m 28MB ---- 838MB 150B 6549kB OK
一覧に表示される列の意味は以下の通りです。
show timeline
コマンドにて、各バックアップのタイムラインを表示できます。
$ pg_rman show timeline
============================================================
Start Mode Current TLI Parent TLI Status
============================================================
2011-11-27 19:16:37 INCR 1 0 RUNNING
2011-11-27 19:16:20 INCR 1 0 OK
2011-11-27 19:15:45 FULL 1 0 OK
また、timeline
の指定有無に関わらず、「Start」に表示される日付を show
コマンドに指定するとバックアップの詳細を表示できます。
$ pg_rman show '2015-03-10 13:25:05'
# configuration
BACKUP_MODE=FULL
FULL_BACKUP_ON_ERROR=false
WITH_SERVERLOG=true
COMPRESS_DATA=true
# result
TIMELINEID=1
START_LSN=0/32000028
STOP_LSN=0/320000f8
START_TIME='2015-03-10 13:25:05'
END_TIME='2015-03-10 13:25:13'
RECOVERY_XID=1836
RECOVERY_TIME='2015-03-10 13:25:08'
TOTAL_DATA_BYTES=28920624
READ_DATA_BYTES=28920624
READ_ARCLOG_BYTES=838868754
READ_SRVLOG_BYTES=150
WRITE_BYTES=6549216
BLOCK_SIZE=8192
XLOG_BLOCK_SIZE=8192
STATUS=OK
取得した検証済みバックアップを用いて、必要なファイルをリストアします。
リストアを行う前に、PostgreSQL サーバを停止させる必要があります。
また、既存のデータベースクラスタは残しておいてください。 pg_rmanがリストアの際にタイムラインやデータチェックサム有無などの情報を読み取る必要があるためです。 pg_rmanがリストア中に未アーカイブの WAL をバックアップしつつ、その他のデータを削除します。 未アーカイブの WAL のバックアップは次に全体バックアップを取得するまで保持されるので、リカバリ結果が望んだものでなかった場合は再度リストアからやり直すことが可能です。
リストア時に、$PGDATA
に recovery.conf を生成します。
必要に応じてこのファイルを編集してから PostgreSQL を起動して PITR を実行してください。
リカバリ結果が確認できたら、速やかに全体バックアップを取得してください。
--recovery-target-timeline
を指定しなかった場合は、制御ファイル($PGDATA/global/pg_control
) の最終チェックポイントタイムラインをターゲットとしてリストアします。
pg_control が存在しない場合は、リストアのベースとなる全体バックアップのタイムラインをターゲットとしてリストアします。
delete
コマンドで日時を指定すると、そこまでのリカバリに不要なバックアップを削除できます。以下の例では、2009年9月11日の 12:00 時点にリカバリするのに不要なバックアップを削除しています。
$ pg_rman show
============================================================================
Start Time Total Data WAL Log Backup Status
============================================================================
2009-09-11 20:00:01 0m ---- ---- 0B ---- 0B OK
2009-09-11 15:00:53 0m ---- 8363B 16MB ---- 2346kB OK
2009-09-11 10:00:48 0m ---- ---- 0B ---- 0B OK
2009-09-11 05:00:06 0m 40MB ---- 16MB ---- 5277kB OK
2009-09-11 00:00:02 0m ---- 8363B 16MB ---- 464kB OK
2009-09-10 20:30:12 0m ---- ---- 0B ---- 0B OK
2009-09-10 15:00:06 0m ---- ---- 16MB ---- 16kB OK
2009-09-10 10:00:02 0m ---- 8363B 16MB ---- 16kB OK
2009-09-10 05:00:08 0m 40MB ---- 150MB ---- 13MB OK
$ pg_rman delete 2009-09-11 12:00:00
$ pg_rman show
============================================================================
Start Time Total Data WAL Log Backup Status
============================================================================
2009-09-11 20:00:01 0m ---- ---- 0B ---- 0B OK
2009-09-11 15:00:53 0m ---- 8363B 16MB ---- 2346kB OK
2009-09-11 10:00:48 0m ---- ---- 0B ---- 0B OK
2009-09-11 05:00:06 0m 40MB ---- 16MB ---- 5277kB OK
PostgreSQL 9.0 以降のレプリケーションを利用している場合、スタンバイサイトでバックアップを取得することができます。
スタンバイサイトでのバックアップを行うためには、通常の pg_rman の利用方法と異なるオプションを指定する必要があります。
スタンバイサイトで pg_rman を用いたバックアップを行う使用例を示します。 基本的な使用方法は、単体の PostgreSQL で利用する場合と同様なので、注意が必要な点のみ記述します。
まず、バックアップカタログの初期化についてです。 -D
/--pgdata
で指定するものは、スタンバイのデータベースクラスタへのパスとなります。
$ pg_rman init -B <バックアップカタログパス> -D <(スタンバイの)PostgreSQLのデータベースクラスタパス>
スタンバイサイトでバックアップを取得するには、-D
/--pgdata
オプションでスタンバイサイトのデータベースクラスタを指定し、その他の接続オプション(-d
/--dbname
、-h
/--host
、-p
/--port
など)でマスタサイトの設定情報を指定します。 スタンバイ接続オプション (--standby-host
、--standby-port
) でスタンバイサイトの設定情報を指定します。--standby-host
と --standby-port
は両方とも指定する必要があります。
以下の環境において、スタンバイサイトからバックアップを取得する際のコマンド例を示します。
$ pg_rman backup --pgdata=/home/postgres/pgdata_sby --backup-mode=full --host=master --standby-host=localhost --standby-port=5432
バックアップ対象のPostgreSQLが以下のような設定になっているとします。
postgres=# SHOW log_directory ;
log_directory
---------------
pg_log
(1 row)
postgres=# SHOW archive_command ;
archive_command
--------------------------------------------
cp %p /home/postgres/arc_log/%f
(1 row)
また、PostgreSQLのデータベースクラスタのパスを環境変数 PGDATA
に、pg_rmanが管理するバックアップカタログのパスを環境変数 BACKUP_PATH
に設定しておきます。
これによりpg_rmanの各コマンド実行時に毎回これらの値をオプションで指定する必要がなくなります。
$ echo $PGDATA
/home/postgres/pgdata
$ echo $BACKUP_PATH
/home/postgres/backup
バックアップカタログの初期化を行います
$ pg_rman init
INFO: ARCLOG_PATH is set to '/home/postgres/arclog'
INFO: SRVLOG_PATH is set to '/home/postgres/pgdata/pg_log'
バックアップカタログの初期化を行うと、BACKUP_PATH
配下にファイル pg_rman.ini
が生成されます。
このファイルに記載したオプションは、各pg_rmanのコマンド実行時にデフォルトとして使用されるため、コマンドラインオプションにて指定する必要がなくなります。
一般的な運用では、ほぼ全てのパラメータは設定ファイルで指定し、バックアップモードのみをコマンドラインで与えることになるでしょう。
pg_rman.ini
内で指定する際のオプション名については、パラメータの指定方法を参照してください。
今回は以下の様なオプション設定をデフォルトとして採用するとします。
$ cat $BACKUP_PATH/pg_rman.ini
ARCLOG_PATH = /home/postgres/arclog
SRVLOG_PATH = /home/postgres/pgdata/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
バックアップを行います。 まずはデータベース全体のバックアップを取得します。 今回は合わせてサーバログもバックアップするとします。
$ 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 show
============================================================================
Start Time Total Data WAL Log Backup Status
============================================================================
2015-03-10 13:25:05 0m 28MB ---- 838MB 150B 6549kB DONE
Status列の値がDONEになっているのは、バックアップ取得は完了したが、検証を実施していないためです。
validate
コマンドを実行して、上記で取得したバックアップの検証を行います。
$ pg_rman validate
INFO: validate: 2015-03-10 13:25:05 backup and archive log files by CRC
$ pg_rman show
============================================================================
Start Time Total Data WAL Log Backup Status
============================================================================
2015-03-10 13:25:05 0m 28MB ---- 838MB 150B 6549kB OK
検証が成功したため、showコマンドの出力結果にてStatus列の値がOKになっています。
現在のデータベースを破棄し、バックアップからリストアします。
$ pg_ctl stop -m immediate
$ pg_rman restore
リストア完了後にpg_rmanが生成したrecovery.confの内容を確認し、必要に応じて修正を行います。 今回の場合は、最新の状態までリカバリするため特に修正せず、そのままPostgreSQLを起動してPITRを実施させます。
$ cat $PGDATA/recovery.conf
# recovery.conf generated by pg_rman 1.2.11
restore_command = 'cp /home/postgres/arclog/%f %p'
recovery_target_timeline = '1'
$ pg_ctl start
pg_rman では、下記のコマンドライン引数を指定できます。一部のオプションは環境変数でも指定できます。詳細はパラメータの指定方法を参照してください。
データの場所に関するパスは、絶対パスで指定する必要があります。
-D PATH
/ --pgdata=PATH
-A PATH
/ --arclog-path=PATH
-S PATH
/ --srvlog-path=PATH
-B PATH
/ --backup-path=PATH
-c
/ --check
--verbose
オプションと組み合わせて処理内容を確認するのに使用します。-v
/ --verbose
-b { full | incremental | archive }
/ --backup-mode={ full | incremental | archive }
full
), 増分バックアップ (incremental
), アーカイブ WAL バックアップ (archive
) のいずれかを指定できます。指定した文字列の前方一致で判定されるため、-b f
は full
と同じ動作になります。
-s
/ --with-serverlog
-Z
/ --compress-data
-C
/ --smooth-checkpoint
pg_start_backup()
の第2引数に相当します。--keep-data-generations
/ --keep-data-days
--keep-data-generations
では保存する世代数を、--keep-data-days
では最低保存日数を指定します。有効にするためには両方のオプションを指定する必要があります。両方の閾値を超えた全体バックアップだけが削除されます。--keep-arclog-files
/ --keep-arclog-days
--keep-arclog-files
では保存ファイル数を、--keep-arclog-days
では保存日数を指定し、どちらの閾値も超えたファイルだけがアーカイブ格納領域から削除されます。 保存期限を有効にするには、--keep-arclog-files
、--keep-arclog-days
両方のオプションを指定する必要があります。--keep-srvlog-files
/ --keep-srvlog-days
--keep-srvlog-files
では保存ファイル数を、--keep-srvlog-days
では保存日数を指定し、どちらの閾値も超えたファイルだけがサーバログが保存されるディレクトリ (log_directory) から削除されます。 本オプションは、--with-serverlog
、--srvlog-path
を指定してバックアップを取得した場合に限ります。 また、保存期限を有効にするには、--keep-srvlog-files
、--keep-srvlog-days
両方のオプションを指定する必要があります。–recovery で始まる変数は recovery.conf のパラメータに対応します。詳細はリカバリの設定を参照してください。
--recovery-target-timeline TIMELINE
$PGDATA/global/pg_control
から取得)でリカバリを行います。--recovery-target-time TIMESTAMP
--recovery-target-xid XID
--recovery-target-inclusive
以下は、リストア時の挙動を指定するパラメータです。
--hard-copy
-a
/ --show-all
PostgreSQLに接続するためのパラメータです。
-d DBNAME
/ --dbname=DBNAME
-h HOSTNAME
/ --host=HOSTNAME
-p PORT
/ --port=PORT
-U USERNAME
/ --username=USERNAME
-w
/ --no-password
-W
/ --password
スタンバイサイトの PostgreSQL に接続するためのパラメータです。 スタンバイサイトからバックアップを取得する際のみに使用します。
--standby-host
--standby-port
--help
-V
/ --version
-!
/ --debug
pg_rman では、一部の設定項目は、環境変数や設定ファイルでも指定できます。コマンドラインオプション、環境変数、設定ファイル項目の対応関係は以下の表の通りです。
短形式 | 長形式 | 環境変数 | 設定ファイル | 意味 | 備考 |
---|---|---|---|---|---|
-h | –host | PGHOST | データベースホスト名およびソケットディレクトリ名 | ||
-p | –port | PGPORT | データベースポート番号 | ||
-d | –dbname | PGDATABASE | データベース名 | ||
-U | –username | PGUSER | データベースユーザ名 | ||
PGPASSWORD | データベースパスワード | ||||
-w | –password | データベースパスワード入力の強制 | |||
-W | –no-password | データベースパスワード入力プロンプトを出さない | |||
-D | –pgdata | PGDATA | 指定可 | データベースクラスタのパス | |
-B | –backup-path | BACKUP_PATH | 指定可 | バックアップカタログのパス | |
-A | –arclog-path | ARCLOG_PATH | 指定可 | WALアーカイブ先のパス | |
-S | –srvlog-path | SRVLOG_PATH | 指定可 | サーバログディレクトリのパス | |
-b | –backup-mode | BACKUP_MODE | 指定可 | バックアップ対象 (full, incremental, or archive) | |
-s | –with-serverlog | WITH_SERVERLOG | 指定可 | サーバログを共にバックアップ | 環境変数、設定ファイルにはboolean型で指定 |
-Z | –compress-data | COMPRESS_DATA | 指定可 | データ圧縮あり | 環境変数、設定ファイルにはboolean型で指定 |
-C | –smooth-checkpoint | SMOOTH_CHECKPOINT | 指定可 | 平滑化チェックポイント | 環境変数、設定ファイルにはboolean型で指定 |
–standby-host | STANDBY_HOST | 指定可 | スタンバイサイトのホスト名 | ||
–standby-port | STANDBY_PORT | 指定可 | スタンバイサイトのポート番号 | ||
–keep-data-generations | KEEP_DATA_GENERATIONS | 指定可 | データベースバックアップの保存世代数 | ||
–keep-data-days | KEEP_DATA_DAYS | 指定可 | データベースバックアップの保存日数 | ||
–keep-srvlog-files | KEEP_SRVLOG_FILES | 指定可 | サーバログの保存ファイル数 | ||
–keep-srvlog-days | KEEP_SRVLOG_DAYS | 指定可 | サーバログの保存日数 | ||
–keep-arclog-files | KEEP_ARCLOG_FILES | 指定可 | アーカイブ WAL の保存ファイル数 | ||
–keep-arclog-days | KEEP_ARCLOG_DAYS | 指定可 | アーカイブ WAL の保存日数 | ||
–recovery-target-timeline | RECOVERY_TARGET_TIMELINE | 指定可 | リカバリ到達点のタイムライン ID | ||
–recovery-target-xid | RECOVERY_TARGET_XID | 指定可 | リカバリ到達点のトランザクション ID | ||
–recovery-target-time | RECOVERY_TARGET_TIME | 指定可 | リカバリ到達点のタイムスタンプ | ||
–recovery-target-inclusive | RECOVERY_TARGET_INCLUSIVE | 指定可 | リカバリ到達点自体をリカバリするか | ||
–hard-copy | HARD_COPY | 指定可 | アーカイブWALのリストア方法 | 環境変数、設定ファイルにはboolean型で指定 |
また、このユーティリティは、他のほとんどの PostgreSQL ユーティリティと同様、 libpq でサポートされる環境変数を使用します。詳細については、環境変数の項目を参照してください。
pg_rman を使用する際には、以下の使用上の注意と制約があります。
スタンバイサイトでのバックアップ取得の際には、以下の制約事項があります。
ストレージ・スナップショットを利用する際には、以下の制約事項があります。
pg_rman では、タイムラインやトランザクション ID、タイムスタンプでリカバリ到達点を指定することにより、任意の時点の状態にデータベースをリカバリすることができます。正確なリカバリ到達点を決定するには、pg_xlogdump(9.3~) / xlogdump (~9.2) などのツールで WAL に書かれているトランザクション内容を確認してください。タイムラインやリカバリ到達点の詳細については継続的アーカイブとポイントインタイムリカバリ(PITR)を参照してください。
設定ファイルには「設定項目=設定値
」の書式でパラメータを指定します。指定可能な項目は パラメータの指定方法 を参照してください。設定値に空白を含む場合はシングルクォートで囲んでください。設定ファイル内の “#
” 以降はコメントとして無視されます。また、設定値以外の空白及びタブは無視されます。
pg_rman ではエラーの種別ごとに異なるプログラム終了コードを返します。
コード | 名前 | 意味 |
---|---|---|
0 | SUCCESS | 正常に終了しました。 |
1 | HELP | ヘルプを表示し、終了しました。 |
2 | ERROR | 未分類のエラーです。 |
3 | FATAL | エラーが再帰的に発生し強制終了しました。 |
4 | PANIC | 未知の致命的エラーです。 |
10 | ERROR_SYSTEM | I/O またはシステムエラーです。 |
11 | ERROR_NOMEM | メモリ不足です。 |
12 | ERROR_ARGS | 入力パラメータが不正です。 |
13 | ERROR_INTERRUPTED | シグナルにより中断されました。(Ctrl+C 等) |
14 | ERROR_PG_COMMAND | PostgreSQL サーバへ発行したSQLが失敗しました。 |
15 | ERROR_PG_CONNECT | PostgreSQL サーバに接続できません。 |
20 | ERROR_ARCHIVE_FAILED | WAL アーカイブに失敗しました。 |
21 | ERROR_NO_BACKUP | バックアップが見つかりません。 |
22 | ERROR_CORRUPTED | バックアップが破損しています。 |
23 | ERROR_ALREADY_RUNNING | 他の pg_rman が実行中です。 |
24 | ERROR_PG_INCOMPATIBLE | PostgreSQL サーバとの互換性がありません。 |
25 | ERROR_PG_RUNNING | PostgreSQL サーバが起動中のためリストアできません。 |
26 | ERROR_PID_BROKEN | postmaster.pid ファイルが破損しています。 |
ストレージ・スナップショット利用時にスナップショットの取得とファイルシステムへのマウントを行うスクリプトです。外部スクリプトを追加する場合は、外部スクリプトの各インタフェースをストレージのマニュアル等を参考に実装します。実装すべき内容は インタフェース仕様 を参照してください。
外部スクリプトは1回の実行で、1個以上のスナップショットを対象とした各種操作を行います。
外部スクリプトはバックアップカタログ直下に “snapshot_script
” のファイル名で格納します。
pg_rman では、LVM (Logical Volume Manager) 向けの外部スクリプトのサンプル (snapshot_script_lvm.sh) を提供します。
$ </samp><kbd>${BACKUP_PATH}/snapshot_script { split | resync | mount | umount | freeze | unfreeze } [cleanup]
{ split | resync | mount | umount | freeze | unfreeze }
[cleanup]
cleanup
が指定された時は、エラーが発生した場合に警告メッセージを出力して処理を継続します。resync
、umount
、unfreeze
にのみ適用します。split
操作の実行により、スナップショットボリュームを作成します。freeze
操作の実行により、ファイルシステムのI/Oを凍結します。mount
操作の実行により、スナップショットボリュームのマウントを作成します。split
操作の実行により、スナップショットに含まれるテーブルスペース名を出力します。mount
操作の実行により、スナップショットに含まれるテーブルスペース名および当該テーブルスペースの格納ディレクトリを <テーブルスペース名>=<テーブルスペース格納ディレクトリ> の形式で出力します。SUCCESS
” を出力し、エラー時には何も出力しません。なお、split
、mount
の場合には末行に出力します。split
PG-DATA
” とします。resync [cleanup]
split
で作成したスナップショットを削除する処理を実装します。cleanup
が指定されている場合は、スナップショットの削除に失敗したとき、その旨の警告メッセージを出力し、残りのスナップショットの削除を継続します。mount
split
で作成したスナップショットをファイルシステムにマウントする処理を実装します。PG-DATA
” とします。umount [cleanup]
mount
で作成したファイルシステムへのマウントを削除する処理を実装します。cleanup
が指定されている場合は、マウントの削除に失敗したときに、その旨の警告メッセージを出力し、残りのマウントの削除を継続します。freeze
unfreeze [cleanup]
freeze
で凍結したファイルシステムのI/Oを解除する処理を実装します。cleanup
が指定されている場合は、ファイルシステムのI/Oの凍結解除に失敗したとき、その旨の警告メッセージを出力し、残りのファイルシステムのI/Oの凍結解除を継続します。split
スナップショット対象とするボリュームに対して、ルートユーザ権限で lvcreate コマンドを実行します。
$ sudo /usr/sbin/lvcreate --snapshot --size=2G --name snap00 /dev/VolGroup00/LogVolume00
上記は論理ボリューム “LogVolume00” のスナップショットを作成する場合の例です。
resync
スナップショット対象とするボリュームに対して、ルートユーザ権限で lvremove コマンドを実行します。
$ sudo /usr/sbin/lvremove -f /dev/VolGroup00/snap00
mount
スナップショット対象とするボリュームに対して、ルートユーザ権限で mount コマンドを実行します。
$ sudo /bin/mount /dev/VolGroup00/snap00 /mnt/snapshot_lvm/pgdata
上記は、split
で作成したスナップショットボリュームを “/mnt/snapshot_lvm/pgdata” にマウントする場合の例です。
umount
スナップショット対象とするボリュームに対して、ルートユーザ権限で umount コマンドを実行します。
$ sudo /bin/umount /mnt/snapshot_lvm/pgdata
freeze
unfreeze
pg_rman のインストールは、標準の contrib モジュールと同様です。
pgxs を使ってビルドできます。
$ cd pg_rman
$ make
$ make install
データベースへの登録は不要です。