2. プロセスとメモリー
3.4 オンライン・バックアップ
3.4.1 オンライン・バックアップの動作
オンライン・バックアップはインスタンス起動状態でバックアップを取得する方法です。
インスタンスに対して pg_start_backup 関数を発行し、データベース・クラスタ以下の全 ファイルをバックアップします。バックアップが完了したらpg_stop_backup関数を実行し ます。これらの操作はpg_basebackupコマンドで自動的に行うことができます。オンライ ン・バックアップはデータベース・クラスタ(および外部テーブル空間)全体のバックア ップを取得する必要があります。データベース単位のバックアップはpg_dumpコマンド等 の論理バックアップを使用する必要があります。
□ pg_start_backup関数
オンライン・バックアップの開始を宣言します。この関数が実行されると、バックアッ プ 開 始 時 の WAL オ フ セ ッ ト 値 が 表 示 さ れ ま す 。 ま た ラ ベ ル ・ フ ァ イ ル
「{PGDATA}/backup_label」が作成されます。ラベル・ファイルには、バックアップの開 始時間やWALの情報が記載されます。
例 51 オンライン・バックアップの開始
例 52 pg_start_backup関数実行時のbackup_labelファイル postgres=# SELECT pg_start_backup(now()::text) ; pg_start_backup
--- 0/59000028 (1 row) postgres=#
$ cat data/backup_label
START WAL LOCATION: 0/59000028 (file 000000010000000000000059) CHECKPOINT LOCATION: 0/59000028
BACKUP METHOD: pg_start_backup BACKUP FROM: master
START TIME: 2014-05-28 13:36:25 JST LABEL: 2014-05-28 13:36:25.256729+09
□ pg_stop_backup関数
オンライン・バックアップの完了を宣言します。この関数が実行されると、バックアッ プ終了時のWALオフセット値が表示されます。またpg_start_backup関数実行時に作成さ れたラベル・ファイル「{PGDATA}/backup_label」は削除され、アーカイブ・ログディレ クトリに新規のラベル・ファイルが作成されます。
例 53 オンライン・バックアップの終了
パ ラ メ ー タ archive_mode=off の 状 態 で オ ン ラ イ ン ・ バ ッ ク ア ッ プ を 実 行 す る と 、
pg_stop_backup関数実行時に以下の警告が表示されます。
例 54 オンライン・バックアップの終了(archive_mode=off)
3.4.2 バックアップ・ラベル・ファイル
バックアップ・ラベル・ファイルは、オンライン・バックアップの終了情報が記載され るテキストファイルです。pg_start_backup関数を実行すると、「{PGDATA}/backup_label」
ファイルとして作成されます。pg_stop_backup関数を実行すると、backup_labelファイル は内容を再読み込みした後削除され、アーカイブ・ログと同じディレクトリに以下のフォ ーマットの名前で作成されます。
postgres=# SELECT pg_stop_backup() ;
NOTICE: pg_stop_backup complete, all required WAL segments have been archived pg_stop_backup
--- 0/5B0000B8 (1 row)
postgres=# SELECT pg_stop_backup() ;
NOTICE: WAL archiving is not enabled; you must ensure that all required WAL segments are copied through other means to complete the backup
pg_stop_backup --- 0/590000B8 (1 row)
ラベル・ファイルのフォーマット
インスタンス停止時に backup_label ファイルが残っている場合、同じディレクトリに backup_label.oldファイルに名前が変更されます。この処理は、pg_ctl stop -m immediate コマンドを実行した場合でも実施されます。
イ ンスタンス起動時に backup_label ファイルが残っている場合も、ファイル名 が
backup_label.oldにファイル名が変更されてからインスタンスが起動されます。
例 55 backup_labelファイルが残った状態でインスタンス起動
ラベル・ファイルはテキスト形式のファイルで、オンライン・バックアップに関する情 報が記載されています。
表 32 バックアップ・ラベル・ファイルの内容
行 出力内容 説明 備考
1 START WAL LOCATION: バックアップ開始時のWAL
2 STOP WAL LOCATION: バックアップ終了時のWAL
3 CHECKPOINT LOCATION: チェックポイント情報
4 BACKUP METHOD: バックアップ方法
5 BACKUP FROM: バックアップ元
6 START TIME: 開始時刻
7 LABEL: バックアップ・ラベル
8 STOP TIME: 終了時刻
最終行のSTOP TIMEはpg_stop_backup関数を実行した場合に限り出力されます。
{WALFILE}.{WALOFFSET}.backup
2013-05-28 11:47:57 JST LOG: database system was shut down at 2013-05-28 11:47:26 JST
2013-05-28 11:47:57 JST FATAL: invalid data in file "backup_label"
2013-05-28 11:47:57 JST LOG: startup process (PID 9240) exited with exit code 1 2013-05-28 11:47:57 JST LOG: aborting startup due to startup process failure
例 56 ラベル・ファイル
3.4.3 レプリケーションとオンライン・バックアップ
オンライン・バックアップ関数を実行できるのはマスター・インスタンスのみです。ス レーブ・インスタンスで実行すると「ERROR: recovery is in progress」エラーが発生しま す。
例 57 スレーブ・インスタンスでオンライン・バックアップ
マスター・インスタンスでオンライン・バックアップ実行中にスレーブ・インスタンスで
pg_is_in_backup関数を実行するとf(オンライン・バックアップ中ではない)が返ります。
例 58 スレーブ・インスタンスでオンライン・バックアップのチェック START WAL LOCATION: 0/5B000028 (file 00000001000000000000005B) STOP WAL LOCATION: 0/5B0000B8 (file 00000001000000000000005B) CHECKPOINT LOCATION: 0/5B000028
BACKUP METHOD: pg_start_backup BACKUP FROM: master
START TIME: 2014-05-28 13:39:39 JST LABEL: 2014-05-28 13:39:38.764743+09 STOP TIME: 2014-05-28 13:39:46 JST
postgres=# SELECT pg_start_backup(now()::text) ; ERROR: recovery is in progress
HINT: WAL control functions cannot be executed during recovery.
postgres=#
postgres=# SELECT pg_is_in_backup() ; pg_is_in_backup
--- f
(1 row)
3.4.4 オンラインバックアップとインスタンス停止
オンライン・バックアップ中に、smartモードを指定したインスタンス停止は失敗します。
停止に失敗した場合でもインスタンスはシャットダウン中のステータスになるため一般ユ ーザーは接続できません。オンライン・バックアップ中にインスタンスを強制的に停止す るにはfastモードを指定します。
例 59 オンライン・バックアップ中のインスタンス停止
postgres=# SELECT pg_start_backup(now()::text) ; pg_start_backup
--- 0/A5000028 (1 row) postgres=# \q
$
$ pg_ctl -D data stop
WARNING: online backup mode is active
Shutdown will not complete until pg_stop_backup() is called.
waiting for server to shut
down... failed pg_ctl: server does not shut down
HINT: The "-m fast" option immediately disconnects sessions rather than waiting for session-initiated disconnection.
$ echo $?
1
$ pg_ctl -D data stop -m fast
waiting for server to shut down.... 2014-06-13 12:37:27 JST 00000 DEBUG: logger shutting down
done
server stopped
$