はじめに
PostgreSQLにはコア機能として提供されているバックアップの機能がいくつか存在します。
今回はそれらの機能から、PostgreSQLが稼働した(サービスを継続した)状態で取得できる「論理バックアップ」、「オンラインバックアップ」についてまとめてみました。
1. PostgreSQLで実施可能なバックアップ手法の一覧
追加モジュール等を利用せず、PostgreSQLが提供する機能で実施可能なバックアップの取得方法を以下にまとめます。
論理バックアップ
データベースの内容をSQLで保存することを論理バックアップと呼びます。
項番 | バックアップの格納先 | バックアップの対象 | コマンド | コマンド実行例(*1) | リカバリに必要なWALのバックアップ(*2) |
---|---|---|---|---|---|
1-1 | ローカル | 特定のデータベース | pg_dump | $ pg_dump -Fc db_name > db.dump | -(不要) |
1-2 | ローカル | 特定のテーブルのみ | pg_dump | $ pg_dump db_name -t tbl_name > db.sql | -(不要) |
1-3 | ローカル | データのみ | pg_dump | $ pg_dump db_name -a > db.sql | -(不要) |
1-4 | ローカル | スキーマ情報のみ | pg_dump | $ pg_dump db_name -s > db.sql | -(不要) |
1-5 | ローカル | DBクラスタ全体 | pg_dumpall | $ pg_dumpall > db.sql | -(不要) |
※ローカル:PostgreSQLがインストールされたサーバ上でマウントされているディスク |
物理バックアップ
本項目では、物理バックアップのうち、PostgreSQLが稼働した状態で取得可能なオンラインバックアップについて記載する。(DBを停止した状態で取得するオフラインバックアップも存在するが、PostgreSQLではオフラインバックアップで提供される機能はないため、本項目では説明をしない。)
取得したバックアップファイルをPostgreSQLでは「ベースバックアップ」と呼びます。リストアには、ベースバックアップとWALファイルが必要になります。
項番 | バックアップの格納先 | バックアップの対象 | コマンド | コマンド実行例(*1) | リカバリに必要なWALのバックアップ(*2) |
---|---|---|---|---|---|
1-6 | ローカル | DBクラスタ全体 | pg_start_backup pg_stop_backup |
$ psql -c "SELECT pg_start_backup(now()::text)" $ rsync 等 $ psql -c "SELECT pg_stop_backup()" |
手動(*3) |
1-7 | ローカル | DBクラスタ全体 | pg_basebackup | $ pg_basebackup -D $BACKUP --xlog-method=stream | 自動 |
1-8 | リモート | DBクラスタ全体 | pg_start_backup pg_stop_backup |
$ psql -c "SELECT pg_start_backup(now()::text)" $ scp 等 $ psql -c "SELECT pg_stop_backup() |
手動(*3) |
1-9 | リモート | DBクラスタ全体 | pg_basebackup | $ pg_basebackup -F tar -D - -z --xlog|ssh remote_node "cat > BACKUP.tar.gz" | 自動(*4) |
※リモート:PostgreSQLが入っていないサーバ上のディスク等 |
- (*1) 各コマンドで使用できるオプション等の詳細についてはマニュアルを参照してください。
- (*2) データベースをリストアするには、「ベースバックアップ」と「以下のWAL」が必要になります。
- 項番1-6、1-7の場合、pg_start_backup実行後~pg_stop_backup実行完了までの期間中に発生したWAL
- 項番1-9の場合、pg_basebackupコマンド実行から完了までの期間中に発生したWAL
- (*3) ベースバックアップ取得中に発生したWALを手動で回収する必要があります。
- (*4) ベースバックアップ取得中の処理量が多く、WALがローテートした場合は手動で回収する必要があります。
2. バックアップ方式はどうやって決めるのか?
上記のようにバックアップ方式は色々ありますが、どの方式を選択すべきかは、何をどのようにバックアップしたいかという要件によって変わります。
例として、いくつかの要件とそれに当てはまる方式を考えてみました。
項番 | 要件例 | 選択すべき方式 |
---|---|---|
2-1 | 特定のテーブルやDBのみをバックアップしたい。 | 項番1-1,1-2 pg_dumpのみ実施可能。 |
2-2 | 任意のスクリプト経由でDBクラスタ全体のバックアップを行いたい。 | 項番1-6 pg_start_backup/pg_stop_backupで実施可能。 |
2-3 | リストアに必要なアーカイブWALを自動で回収したい。 | 項番1-7 pg_basebackupコマンドの「--xlog-method=stream」オプションで実施可能。 |
2-4 | リモートにDBクラスタ全体のバックアップを送りたい。 | 項番1-9 pg_basebackupコマンドの「-F tar -D -」オプションで実施可能。 |
こんな感じで、要件によって選択すべきバックアップ方式は異なります。
他にも「リストアに掛かる時間を短くしたい」や「バックアップファイルのデータ量を小さくしたい」等というように要件は様々なため状況によって都度何が良いか考える必要があります。
さいごに
色々書いてみたものの、冗長化のためにスタンバイ作るときにも使うし、特別な要件でもない限りpg_basebackupコマンド(項番1-7)を使えばいいんじゃないかと思う。