★PostgreSQLカンファレンス2021 11月12日開催/チケット販売中★
他のバージョンの文書 13 | 12 | 11 | 10 | 9.6 | 9.5 | 9.4 | 9.3 | 9.2 | 9.1 | 9.0 | 8.4 | 8.3 | 8.2 | 8.1 | 8.0 | 7.4 | 7.3 | 7.2

22.2. ファイルシステムレベルのバックアップ

バックアップ戦略の代替案として PostgreSQL がデータベース内のデータを保存するために使用しているファイルを直接コピーする方法があります。 項16.2 にこれらのファイルがどこにあるか解説されていますが、この方法に興味がある方はもう既に発見していることでしょう。 下記のような通常のファイルシステムのバックアップを行うどんな方法でも問題ありません。

tar -cf backup.tar /usr/local/pgsql/data

しかしこの方法には 2 つの制約があり、そのためにあまり実用的ではなく、少なくとも pg_dump より劣るといわざるを得ません。

  1. 有効なバックアップを行うにはデータベースサーバを必ず 停止しなければなりません。 全ての接続を無効とするような中途半端な対策では作用しません。 (主な理由は、tarやその類似ツールはある時点におけるファイルシステムの原始的なスナップショットを取らないことです。) サーバの停止に関しては 項16.6 を参照してください。 いうまでもありませんが、データをリストアする前にもサーバを停止させる必要があります。

  2. データベースのファイルシステムレイアウトの詳細を熟知している場合、ある個別のテーブルやデータベースをそれぞれのファイルやディレクトリからバックアップしたり復元したりすることを試みたいと思うことがあったかもしれません。 しかしそれらのファイルは半分程度の情報しか保有しておらず、この方法では正常なバックアップは行えません。 後の半分の情報は全てのトランザクションのコミット状態を保存しているコミットログファイル pg_clog/* に書かれています。 テーブルファイルはこの情報があって始めて意味を成します。 もちろんテーブルとそれに付帯する pg_clog データだけで復元することも、データベースクラスタにあるほかのテーブルを無効としてしまうのでできません。 ですので、ファイルシステムバックアップは、データベースクラスタ全体の完全なリストア処理にのみ動作します。

その他のファイルシステムバックアップ方法として、ファイルシステムが"整合性を維持したスナップショット"機能をサポートしている場合(かつ、正しく実装されていると信用する場合)、データディレクトリのスナップショットを作成する方法があります。 典型的な手順では、データベースを含むボリュームの"凍結スナップショット"を作成し、データディレクトリ全体(上述のように、一部だけではいけません。)をスナップショットからバックアップデバイスにコピーし、そして、凍結スナップショットを解放します。 これはデータベースサーバが稼動中であっても動作します。 しかし、こうして作成されたバックアップは、データベースサーバが適切に停止していない状態のデータベースファイルを保存します。 そのため、このバックアップデータでデータベースサーバを起動する時、サーバがクラッシュしたものと見なされ、WALログが再現されます。 これは問題ではありません。単に注意してください(そして、確実にバックアップにWALファイルを含めてください)。

対象のデータベースが複数のファイルシステムにまたがって分散している場合、すべてのボリュームに対して完全に同期した凍結スナップショットを得る方法が存在しない可能性があります。 例えば、データファイルとWALログを別のディスクに格納している場合やテーブル空間が異なるファイルシステムに存在する場合、スナップショットは同期していなければならないため、スナップショットバックアップを使用することができないかもしれません。 こうした状況では、整合性を維持したスナップショット技術を信用する前に使用するファイルシステムの文書を熟読してください。 最も安全な方法は、全ての凍結スナップショットを確立するのに十分な期間、データベースサーバをシャットダウンさせることです。

他にもrsyncを使用してファイルシステムバックアップを行う方法があります。 これはまず、データベースサーバの稼動中にrsyncを実行し、そして、2回目のrsyncを実施している間データベースサーバを停止させます。 相対的に転送データ量が少ないため、2回目のrsyncは最初よりもかなり短時間で終わります。 サーバが停止していますので、この最終結果には一貫性があります。 この方法により、最小の停止時間でファイルシステムのバックアップを行うことができます。

ファイルシステムバックアップは、SQLによるダンプより小さくなるとは限らないいことに注意してください。 反対に、これは巨大になりがちです。 (pg_dump では、例えばインデックスの内容をダンプする必要はありません。単にコマンドで再作成します。)