2. プロセスとメモリー
3.4 オンライン・バックアップ
3.4.1 オンライン・バックアップの動作
オンライン・バックアップはインスタンス起動状態でバックアップを取得する方法です。
インスタンスに対して pg_start_backup 関数を発行し、データベース・クラスター以下の 全ファイルをバックアップします。バックアップが完了したらpg_stop_backup関数を実行 します。これらの操作はpg_basebackupコマンドで自動的に行うことができます。オンラ イン・バックアップはデータベース・クラスター(および外部テーブル空間)全体のバック アップを取得する必要があります。データベース単位のバックアップはpg_dumpコマンド 等の論理バックアップを使用する必要があります。
□ pg_start_backup関数
オンライン・バックアップの開始を宣言します。この関数が実行されると、バックアップ 開 始 時 の WAL オ フ セ ッ ト 値 が 表 示 さ れ ま す 。 ま た ラ ベ ル ・ フ ァ イ ル
「{PGDATA}/backup_label」が作成されます。ラベル・ファイルには、バックアップの開始 時間やWALの情報が記載されます。
例 65 オンライン・バックアップの開始
例 66 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/6000028 (file 000000010000000000000006) CHECKPOINT LOCATION: 0/6000060
BACKUP METHOD: pg_start_backup BACKUP FROM: master
START TIME: 2017-02-11 12:47:42 JST LABEL: 2017-02-11 12:47:42.2466+09
□ pg_stop_backup関数
オンライン・バックアップの完了を宣言します。この関数が実行されると、バックアップ 終了時の WAL オフセット値が表示されます。また pg_start_backup 関数実行時に作成さ れたラベル・ファイル「{PGDATA}/backup_label」は削除され、アーカイブ・ログディレク トリに新規のラベル・ファイルが作成されます。
例 67 オンライン・バックアップの終了
パラメーターarchive_mode=off の状態でオンライン・バックアップを実行すると、
pg_stop_backup関数実行時に以下の警告が表示されます。
例 68 オンライン・バックアップの終了(archive_mode=off)
□ Non-Exclusiveモード
PostgreSQL 9.6ではNon-Exclusiveモードによるオンライン・バックアップが可能にな
りました。pg_start_backup関数のexclusiveパラメーターにfalseを指定することで実行 できます。このパラメーターのデフォルト値はtrueで、旧バージョンとの互換性が維持さ れています。pg_start_backup関数をとpg_stop_backup関数は、同じモードの指定を行う 必要があります。Non-Exclusiveモードでpg_stop_backup関数を実行すると、Exclusive モードとは出力結果が異なります。
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)
例 69 Non-Exclusiveモードによるオンライン・バックアップ
3.4.2 バックアップ・ラベル・ファイル
バックアップ・ラベル・ファイルは、オンライン・バックアップの情報が記載されるテキ ストファイルです。pg_start_backup関数を実行すると、「{PGDATA}/backup_label」ファ イルとして作成されます。pg_stop_backup関数を実行すると、backup_labelファイルは内 容を再読み込みした後削除され、アーカイブログと同じディレクトリに以下のフォーマッ トの名前で作成されます。
構文 2バックアップ・ラベル・ファイル名のフォーマット {WALFILE}.{WALOFFSET}.backup
postgres=# SELECT pg_start_backup(now()::text, false, false) ; pg_start_backup
--- 0/8000028
(1 row)
postgres=# SELECT pg_stop_backup() ; ERROR: non-exclusive backup in progress
HINT: Did you mean to use pg_stop_backup('f')?
postgres=#
postgres=# SELECT pg_stop_backup(false) ;
NOTICE: pg_stop_backup complete, all required WAL segments have been archived pg_stop_backup
--- (0/8000130,"START WAL LOCATION: 0/8000028 (file 000000010000000000000008)+
CHECKPOINT LOCATION: 0/8000060 + BACKUP METHOD: streamed + BACKUP FROM: master + START TIME: 2017-02-11 12:50:16 JST + LABEL: 2017-02-11 12:50:15.900273+09 + ","16384 /home/postgres/ts1 + ")
(1 row)
インスタンス停止時に backup_label ファイルが残っている場合、同じディレクトリに backup_label.oldファイルに名前が変更されます。この処理は、pg_ctl stop —m immediate コマンドを実行した場合でも実施されます。
イ ンスタンス 起動時に backup_label ファ イルが残っ ている場合も、ファイ ル名が
backup_label.old にファイル名が変更されてからインスタンスが起動されます。ログには
何も出力されません。
ラベル・ファイルはテキスト形式のファイルで、オンライン・バックアップに関する情報 が記載されています。
表 37 バックアップ・ラベル・ファイルの内容
行 出力内容 説明 備考
1 START WAL LOCATION: バックアップ開始時のWAL
2 STOP WAL LOCATION: バックアップ終了時のWAL
3 CHECKPOINT LOCATION: チェックポイント情報
4 BACKUP METHOD: バックアップ方法
5 BACKUP FROM: バックアップ元
6 START TIME: 開始時刻
7 LABEL: バックアップ・ラベル pg_start_backup
関数で指定
8 STOP TIME: 終了時刻 pg_stop_backup関
数により追記
最終行のSTOP TIMEはpg_stop_backup関数を実行した場合に限り出力されます。
例 70 ラベル・ファイル
3.4.3 レプリケーションとオンライン・バックアップ
オンライン・バックアップ関数を実行できるのはマスター・インスタンスのみです。スレ ーブ・インスタンスで実行すると「ERROR: recovery is in progress」エラーが発生します。
例 71 スレーブ・インスタンスでオンライン・バックアップ開始
マスター・インスタンスでオンライン・バックアップ実行中にスレーブ・インスタンス
でpg_is_in_backup関数を実行するとf(オンライン・バックアップ中ではない)が返り
ます。
例 72 スレーブ・インスタンスでオンライン・バックアップのチェック START WAL LOCATION: 0/8000028 (file 000000010000000000000008) STOP WAL LOCATION: 0/8000130 (file 000000010000000000000008) CHECKPOINT LOCATION: 0/8000060
BACKUP METHOD: streamed BACKUP FROM: master
START TIME: 2017-02-11 12:50:16 JST LABEL: 2017-02-11 12:50:15.900273+09 STOP TIME: 2017-02-11 12:50:36 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モードを指定します。
例 73 オンライン・バックアップ中のインスタンス停止
postgres=# SELECT pg_start_backup(now()::text) ; pg_start_backup
--- 0/A5000028 (1 row) postgres=# \q
$
$ pg_ctl -D data stop –m smart
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....
done
server stopped
$