LoginSignup
36
27

More than 1 year has passed since last update.

PostgreSQLが提供するバックアップ機能

Last updated at Posted at 2016-11-25

はじめに

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)を使えばいいんじゃないかと思う。

36
27
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
36
27