pg_rman 1.3

documentation in English
  1. 名前
  2. 概要
  3. 説明
  4. 使用例
  5. オプション
  6. パラメータの指定方法
  7. 使用上の注意と制約
  8. 詳細
  9. 外部スクリプトとの連携
  10. ダウンロード
  11. インストール方法
  12. 動作環境
  13. 関連項目

名前

pg_rman -- PostgreSQL のバックアップとリカバリを管理します。

概要


pg_rman [ OPTIONS ] { init | 
                      backup |
                      restore | 
                      show [ DATE | detail ] | 
                      validate [ DATE ] | 
                      delete DATE | 
                      purge }

pg_rman は以下の機能を持ちます。

DATE には、対象のバックアップのタイムスタンプ (開始日時) を ISO 形式 (YYYY-MM-DD HH:MI:SS) で指定します。DATE の末尾は省略可能で、その場合は指定した DATE の範囲に含まれるバックアップが対象となります。

$ pg_rman show 2009-12 # 2009年12月に取得したバックアップを表示
$ pg_rman validate     # 未検証のすべてのバックアップを検証

以下のコマンドをサポートします。オプション OPTIONS の詳細は オプション を参照してください。

説明

pg_rman は、PostgreSQL のオンライン・バックアップとリカバリを管理するためのプログラムです。 バックアップ方式は、物理オンライン・バックアップです。 バックアップ対象は、データベースクラスタ自体とアーカイブ WAL、サーバログです。

PostgreSQL 9.0以降のレプリケーションを利用している場合、スタンバイサイトでのバックアップに対応しています。

その他、ストレージ・スナップショットを使用したバックアップに対応しています。

バックアップカタログの初期化

pg_rman は、取得したバックアップファイルや管理情報を「バックアップカタログ」という領域に保存します。 このため、まず最初にバックアップカタログを初期化する必要があります。

$ pg_rman init -B <バックアップカタログパス> -D <PostgreSQLのデータベースクラスタパス> -A <アーカイブログの格納パス>

ここで、カタログを初期化する前に postgresql.conf にある log_directoryarchive_modearchive_command を設定しておくことをお奨めします。 これらのパラメータが設定されていると、pg_rman はその値を反映してサーバログの参照先とアーカイブログの参照先を設定することができます。 この場合、PostgreSQL のデータベースクラスタパスを指定する必要があります。

バックアップ取得

バックアップのモードは以下のいずれかで指定します。

バックアップデータの検証

取得したバックアップが適切かどうか検証します。検証にはファイルサイズのチェックとCRCによるチェックを用いています。

バックアップが正常に取得できたら、なるべく早いタイミングでバックアップを検証してください。 未検証のバックアップは、リストアにも増分バックアップの取得基準としても使用できません。

バックアップカタログの情報確認

取得したバックアップは show コマンドにて確認できます。

$ pg_rman show
 =====================================================================
 StartTime            EndTime              Mode    Size   TLI  Status
 =====================================================================
 2015-03-27 11:43:31  2015-03-27 11:43:32  INCR    54kB     1  OK
 2015-03-27 11:43:19  2015-03-27 11:43:20  INCR    69kB     1  OK
 2015-03-27 11:43:04  2015-03-27 11:43:06  INCR   151kB     1  OK
 2015-03-27 11:42:56  2015-03-27 11:42:57  INCR    96kB     1  OK
 2015-03-27 11:34:55  2015-03-27 11:34:58  FULL  5312kB     1  OK

show detail コマンドにて、各バックアップのより詳細な情報を一覧表示できます。

$ pg_rman show detail
 ======================================================================================================================
 StartTime            EndTime              Mode    Data  ArcLog  SrvLog   Total  Compressed  CurTLI  ParentTLI  Status
 ======================================================================================================================
 2015-03-27 11:43:31  2015-03-27 11:43:32  INCR    16kB    33MB    ----    54kB        true       1          0  OK
 2015-03-27 11:43:19  2015-03-27 11:43:20  INCR   148kB    33MB    ----    69kB        true       1          0  OK
 2015-03-27 11:43:04  2015-03-27 11:43:06  INCR   173kB    83MB    ----   151kB        true       1          0  OK
 2015-03-27 11:42:56  2015-03-27 11:42:57  INCR   173kB    50MB    ----    96kB        true       1          0  OK
 2015-03-27 11:34:55  2015-03-27 11:34:58  FULL    28MB    83MB    ----  5312kB        true       1          0  OK

ここで、表示される列の意味は以下の通りです。

個別のバックアップについての詳細な情報は、「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 が存在しない場合は、リストアのベースとなる全体バックアップのタイムラインをターゲットとしてリストアします。

--recovery-target-timeを使用する場合、復元のベースとしたいバックアップ(FULL、INCR、ARCH)のEndTime以降の時刻をする必要があります。

バックアップの削除

delete コマンドで日時を指定すると、そこまでのリカバリに不要なバックアップを削除できます。以下の例では、2015年3月27日の 14:59:00 時点にリカバリするのに不要なバックアップを削除しています。

$ pg_rman show
=====================================================================
 StartTime           EndTime              Mode    Size   TLI  Status
=====================================================================
2015-07-30 13:31:08  2015-07-30 13:31:10  FULL    14MB    15  OK
2015-07-30 13:30:37  2015-07-30 13:30:38  ARCH    53kB    15  OK
2015-07-30 13:30:32  2015-07-30 13:30:33  ARCH    26kB    15  OK
2015-07-30 13:30:11  2015-07-30 13:30:13  FULL    14MB    15  OK
2015-07-30 13:28:10  2015-07-30 13:28:11  INCR   120kB    14  OK
2015-07-30 13:27:45  2015-07-30 13:27:46  INCR    54kB    14  OK
2015-07-30 13:27:32  2015-07-30 13:27:33  INCR    54kB    14  OK
2015-07-30 13:27:25  2015-07-30 13:27:26  INCR    54kB    14  OK
2015-07-30 13:24:02  2015-07-30 13:24:04  FULL    14MB    14  OK

$ pg_rman delete 2015-07-30 13:30:30
WARNING: cannot delete backup with start time "2015-07-30 13:30:11"
DETAIL: This is the latest full backup necessary for successful recovery.
INFO: delete the backup with start time: "2015-07-30 13:28:10"
INFO: delete the backup with start time: "2015-07-30 13:27:45"
INFO: delete the backup with start time: "2015-07-30 13:27:32"
INFO: delete the backup with start time: "2015-07-30 13:27:25"
INFO: delete the backup with start time: "2015-07-30 13:24:02"
 
$ pg_rman show
=====================================================================
 StartTime           EndTime              Mode    Size   TLI  Status
=====================================================================
2015-07-30 13:31:08  2015-07-30 13:31:10  FULL    14MB    15  OK
2015-07-30 13:30:37  2015-07-30 13:30:38  ARCH    53kB    15  OK
2015-07-30 13:30:32  2015-07-30 13:30:33  ARCH    26kB    15  OK
2015-07-30 13:30:11  2015-07-30 13:30:13  FULL    14MB    15  OK

削除済みバックアップの消去

delete コマンドで削除したバックアップは、データ自体はファイルシステムから削除されますが、管理情報が残ります。これらの管理情報をファイルシステムから除外するには purge コマンドを実行してください。

$ pg_rman show -a
=====================================================================
 StartTime           EndTime              Mode    Size   TLI  Status
=====================================================================
2015-07-30 13:31:08  2015-07-30 13:31:10  FULL    14MB    15  OK
2015-07-30 13:30:37  2015-07-30 13:30:38  ARCH    53kB    15  OK
2015-07-30 13:30:32  2015-07-30 13:30:33  ARCH    26kB    15  OK
2015-07-30 13:30:11  2015-07-30 13:30:13  FULL    14MB    15  OK
2015-07-30 13:28:10  2015-07-30 13:28:11  INCR   120kB    14  DELETED
2015-07-30 13:27:45  2015-07-30 13:27:46  INCR    54kB    14  DELETED
2015-07-30 13:27:32  2015-07-30 13:27:33  INCR    54kB    14  DELETED
2015-07-30 13:27:25  2015-07-30 13:27:26  INCR    54kB    14  DELETED
2015-07-30 13:24:02  2015-07-30 13:24:04  FULL    14MB    14  DELETED

$ pg_rman purge
INFO: DELETED backup "2015-07-30 13:28:10" is purged
INFO: DELETED backup "2015-07-30 13:27:45" is purged
INFO: DELETED backup "2015-07-30 13:27:32" is purged
INFO: DELETED backup "2015-07-30 13:27:25" is purged
INFO: DELETED backup "2015-07-30 13:24:02" is purged

$ pg_rman show -a
=====================================================================
 StartTime           EndTime              Mode    Size   TLI  Status
=====================================================================
2015-07-30 13:31:08  2015-07-30 13:31:10  FULL    14MB    15  OK
2015-07-30 13:30:37  2015-07-30 13:30:38  ARCH    53kB    15  OK
2015-07-30 13:30:32  2015-07-30 13:30:33  ARCH    26kB    15  OK
2015-07-30 13:30:11  2015-07-30 13:30:13  FULL    14MB    15  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 は両方とも指定する必要があります。

以下の環境において、スタンバイサイトからバックアップを取得する際のコマンド例を示します。

使用例

バックアップ対象の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_DATA_GENERATIONS = 3
KEEP_SRVLOG_FILES = 10

バックアップを行います。 まずはデータベース全体のバックアップを取得します。 今回は合わせてサーバログもバックアップするとします。

$ pg_rman backup --backup-mode=full --with-serverlog --progress
INFO: copying database files
Processed 1760 of 1760 files, skipped 0
NOTICE:  pg_stop_backup complete, all required WAL segments have been archived
INFO: copying archived WAL files
Processed 21 of 21 files, skipped 0
INFO: copying server log files
Processed 1 of 1 files, skipped 0
INFO: backup complete
HINT: Please execute 'pg_rman validate' to verify the files are correctly copied.
INFO: start deleting old archived WAL files from ARCLOG_PATH (keep files = 10)
INFO: delete "0000000E0000000100000092"
INFO: delete "0000000E0000000100000092.00000028.backup"
INFO: delete "0000000E0000000100000093"
INFO: start deleting old server files from SRVLOG_PATH (keep files = 10)
INFO: start deleting old backup (keep generations = 3)
INFO: does not include the backup just taken
$ pg_rman show
=====================================================================
 StartTime           EndTime              Mode    Size   TLI  Status
=====================================================================
2015-07-30 13:36:38  2015-07-30 13:36:41  FULL    15MB    15  DONE

Status列の値がDONEになっているのは、バックアップ取得は完了したが、検証を実施していないためです。 validate コマンドを実行して、上記で取得したバックアップの検証を行います。

$ pg_rman validate
INFO: validate: "2015-07-30 13:36:38" backup, archive log files and server log files by CRC
INFO: backup "2015-07-30 13:36:38" is valid

$ pg_rman show
=====================================================================
 StartTime           EndTime              Mode    Size   TLI  Status
=====================================================================
2015-07-30 13:36:38  2015-07-30 13:36:41  FULL    15MB    15  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 では、下記のコマンドライン引数を指定できます。一部のオプションは環境変数でも指定できます。詳細はパラメータの指定方法を参照してください。

共通オプション

データの場所に関するパスは、絶対パスで指定する必要があります。

バックアップ・オプション

リストア・オプション

–recovery で始まる変数は recovery.conf のパラメータに対応します。詳細はリカバリの設定を参照してください。

以下は、リストア時の挙動を指定するパラメータです。

カタログ・オプション

接続オプション

PostgreSQLに接続するためのパラメータです。

スタンバイ接続オプション

スタンバイサイトの PostgreSQL に接続するためのパラメータです。 スタンバイサイトからバックアップを取得する際のみに使用します。

一般オプション

パラメータの指定方法

pg_rman では、一部の設定項目は、環境変数や設定ファイルでも指定できます。コマンドラインオプション、環境変数、設定ファイル項目の対応関係は以下の表の通りです。

短形式 長形式 環境変数 設定ファイル 意味 備考
-h –host PGHOST データベースホスト名およびソケットディレクトリ名
-p –port PGPORT データベースポート番号
-d –dbname PGDATABASE データベース名
-U –username PGUSER データベースユーザ名
PGPASSWORD データベースパスワード
-w –no-password データベースパスワード入力プロンプトを出さない
-W –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 を使用する際には、以下の使用上の注意と制約があります。

スタンバイサイトでのバックアップ取得の際には、以下の制約事項があります。

ストレージ・スナップショットを利用する際には、以下の制約事項があります。

詳細

Recovery to Point-in-Time

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 ファイルが破損しています。

外部スクリプトとの連携

ストレージ・スナップショット利用時にスナップショットの取得とファイルシステムへのマウントを行うスクリプトです。外部スクリプトを追加する場合は、外部スクリプトの各インタフェースをストレージのマニュアル等を参考に実装します。実装すべき内容は インタフェース仕様 を参照してください。

コマンド仕様

$ </samp><kbd>${BACKUP_PATH}/snapshot_script { split | resync | mount | umount | freeze | unfreeze } [cleanup]

インタフェース仕様

LVM(Logical Volume Manager)向けの外部スクリプト(サンプル)の処理内容

ダウンロード

pg_rmanのソースコード、もしくはRPMはここからダウンロードできます。


インストール方法

pg_rman のインストールは、標準の contrib モジュールと同様です。

データベースへの登録は不要です。

ソースコードからのインストール

pgxs を使ってビルドできます。

$ cd pg_rman
$ make
$ make install

RPMを用いたインストール

利用環境でのOSのバージョンとPostgreSQLのバージョンに合わせたRPMをダウンロードし、インストールしてください。

# rpm -ivh pg_rman-x.x.xx-x.pgxx.rhelx.x86_64.rpm

動作環境

PostgreSQLバージョン
PostgreSQL 8.4, 9.0, 9.1, 9.2, 9.3, 9.4, 9.5, 9.6
OS
RHEL 5/6/7, Ubuntu 12.04LTS

関連項目

バックアップとリストア