データベースは定型化された情報の集中管理が目的であり、データベースの管理はセキュリティだけでなくバックアップや復元も重要なテーマです。ここでは PostgreSQL サーバ側で定期的に自動で行うデータベースのバックアップとリストアについて説明します。
PostgreSQL におけるバックアップ作業は、PostgreSQLアカウントや全てのデータベースを一括してサーバ管理者が行うバックアップと、各々のユーザーが管理するデータベース単位でのバックアップ作業に分けて具体例を示します。
サーバー管理者が行う PostgreSQL データベースのバックアップには、PostgreSQL が提供するユーティリティーを利用する方法と情報が格納されているディレクトリ丸ごと他の場所へバックアップする方法があります。
前者はデータベースサーバを停止させることなく行えるメリットがありますが、後者はデータベースへの書き込みを防止するためにサービスを停止させる必要があります。
PostgreSQL が提供するバックアップ・ユーティリティには、pg_dump と pg_dumpall があります。何れもユーティリティも、データベースを一つのダンプファイルとして書き出す事が出来ます。
pg_dumpall ではクラスタ全てを一つのダンプファイルで書き出す事が出来るため、アカウント情報を含む全ての環境をバックアップする際に使用します。全てのデータベースに対して権限を持つスーパーユーザーで実行する必要があります。
定期的にpg_dumpall による自動バックアップを行うには、求められるユーザーとパスワードを自動的に入力する必要があります。ここでは、phpPgAdmin を利用しているため自ホストに対し trust を使用する事は出来ませんし、スーパーユーザーに限らず認証なしというのはセキュリティの観点から行うべきではありません。
実行ユーザーのホームディレクトリに認証情報を含む .pgpass ファイルを設置することで認証の自動化が可能になります。
参照 => パスワードファイル ~ PostgreSQL 7.4.6 文書
Linux のシステムアカウントである hogehoge ユーザーによるバックアップ を例に説明します。 /home/hogehoge に .pgpass ファイルを設置します。
必ずパーミッションは 600 に設定します。他のユーザーが読めてはスキップされ、認証が求められます。
.pgpass の書式は以下の通りです。 コロンで区切ります。
ホスト:ポート:データベース:ユーザー:パスワード
hostname:port:database:username:password
localhost:5432:*:postgres:パスワード
もし、他の PostgreSQL ユーザーで pg_dump を使用し、特定のデータベースを dump したい場合は、改行して複数行にわたって記述します。ポイントは pg_dumpall で指定したユーザーやデータベース、ホスト名が一致しなければスキップされるので制限したくない場合は " * " ワイルドカードで指定するようにします。
ネットワーク上にある PostgreSQL サーバのデータベースをリモートでバックアップしたい場合は、localhosot と指定せず、* と指定する事で通ります。或いは複数行にわたって .pgpass で指定するのかもしれません。(未確認)
~/.pgpass が設置できたら、pg_dumpall で PostgreSQL サーバー全体のダンプが取れるか確認します。(PostgreSQLサーバを停止させる必要はありません)
ユーザーと指定したホストが ~/.pgpass と一致しなければ認証が求められます。 pg_dumpall.dump がパスワードを要求せず、エラー無く作成されればOKです。尚、指定したオプションとよく使うオプションは以下の通りです。
その他、詳細はドキュメントを参照して下さい。
option | 内容 |
---|---|
-h | バックアップ対象ホストを指定します。 |
-U | 実行するユーザーを指定します。 (スーパーユーザー権限をもつユーザ) |
-c | 復元する際、一度データベースを削除する スクリプトをdumpファイルに含めます。 |
よく利用するオプション | |
-s | スキーマ(構造)のみをダンプし、データはダンプしません。 (データ未入力状態に戻したい時など) |
pg_dumpall が問題なく動作したら sh 実行ファイルを作成し、cron デーモンで定期的に実行するだけです。システム管理者である hogehoge ユーザー権限で実行する場合の例です。
/home/hogehoge/Maintenance.sh/pg_dumpall.sh
適当なエディタで以下を記述します。
#!/bin/sh
cd /home/hogehoge/Maintenance.sh
pg_dumpall -h localhost -U postgres -c > pg_dumpall.dump
chmod 600 pg_dumpall.dump
chmod 600 は他のユーザーに読めると問題なのでバックアップを取ったユーザーのみ(ここでは管理者のみ)が開けるようにしています。後は、cronデーモンで定期的に実行すれば指定した時間に定期的にバックアップが行えるようになります。
上記、pg_dumpall.sh を hogehoge (Unixユーザ) が定期的に実行する場合、crontab で以下のように指定します。
45 4 * * * hogehoge /home/hogehoge/Maintenance.sh/pg_dumpall.sh
この例では、毎朝 4時 45分 に pg_dumpall.sh を hogehoge ユーザーが実行します。
pg_dumpall の復元はデータベース全体に影響を及ぼすため、データベース単位でのバックアップ作業も併せて必要になります。データベース単位でバックアップを行うには、pg_dump ユーティリティを使用します。
先ほどと同じ、Unix 管理者である hogehoge が特定のデータベースユーザー権限で pg_dump を自動的に実行させる例です。同様に、~/.pgpass にユーザーとパスワードを記述する訳ですが、複数行に渡って指定することで認証を自動化することが出来ます。
localhost:5432:*:postgres:パスワード
localhost:5432:phpGroupWare:phpgw:パスワード
phpgw は、phpGroupWare をインストールする際に作成した専用ユーザーです。 以下の以下は hogehoge ユーザーがデータベース "phpGroupWare" を pg_dump-phpGroupWare.dump というファイルに出力する例です。
オプションに関する詳細はドキュメントを参照して下さい。 多くは pg_dumpall と共通しています。 同様に sh 実行ファイルを作成して定期的に実行すればデータベース単位でバックアップが取れます。
#!/bin/sh
cd /home/hogehoge/Maintenance.sh
pg_dump phpGroupWare -h localhost -U phpgw -c > pg_dump-phpGroupWare.dump
chmod 600 pg_dump-phpGroupWare.dump
管理者が行う pg_dump の用途として、例えば グループウェアなどの業務に関連する重要なデータベースを定期的にバックアップしたい場合などが考えられます。
基本的にデータベースのバックアップは、ユーザーが各々責任をもって行うのが筋ですが、そのためのインターフェイスを提供しないのであれば管理者が代行する必要もあります。
構築するデータベースの規模によって適切なバックアップ、リストア作業を考える必要もあります。例えば、システムのファイル容量制限(ラージファイル)にひかかる場合、圧縮や分割オプションを指定する必要が出てきます。
また、自動バックアップを行う場合も、pg_dumpall でフレームだけバックアップし、個別のデータベースは pg_dump で行うとデータの重複がなくバックアップに要する時間、負荷を節約する事も出来ます。
参考 => 第 22章バックアップとリストア ~ PostgreSQL 7.4.6 文書
次のページでは、ここで作成したダンプファイルの復元作業の具体例を示します。