.
WEB/DB 関連 =>PostgreSQL-Server>3.定期的に自動バックアップ
Linux 活用ガイド:目次

サーバ構築ガイド

レンタル ガイド

ショップ 構築ガイド

情報漏洩対策

PostgreSQL Server 定期自動バックアップ

データベースは定型化された情報の集中管理が目的であり、データベースの管理はセキュリティだけでなくバックアップや復元も重要なテーマです。ここでは PostgreSQL サーバ側で定期的に自動で行うデータベースのバックアップとリストアについて説明します。

バックアップについて

PostgreSQL におけるバックアップ作業は、PostgreSQLアカウントや全てのデータベースを一括してサーバ管理者が行うバックアップと、各々のユーザーが管理するデータベース単位でのバックアップ作業に分けて具体例を示します。

サーバ管理者が行うSQLサーバのバックアップ

サーバー管理者が行う PostgreSQL データベースのバックアップには、PostgreSQL が提供するユーティリティーを利用する方法と情報が格納されているディレクトリ丸ごと他の場所へバックアップする方法があります。

前者はデータベースサーバを停止させることなく行えるメリットがありますが、後者はデータベースへの書き込みを防止するためにサービスを停止させる必要があります。

PostgreSQL が提供するバックアップ・ユーティリティ

PostgreSQL が提供するバックアップ・ユーティリティには、pg_dump と pg_dumpall があります。何れもユーティリティも、データベースを一つのダンプファイルとして書き出す事が出来ます。

  • pg_dump
    • データベース単位でダンプするユーティリティーです。当然ですが、pg_dump を実行するユーザーが目的のデータベースに対して権限を持っている必要があります。一般的に PostgreSQL ユーザーが各々のデータベースをバックアップする目的で利用します。(ここではphpPgAdmin 以外のインターフェイスはユーザーに提供しない方針)
    • 参照 => pg_dumpl ~ PostgreSQL 7.4.6 文書
  • pg_dumpall
    • pg_dumpall では、PostgreSQL アカウントからデータベースの全てを一つのダンプファイルに出力する事が出来ます。データベースのダンプに pg_dump を呼び出しています。この機能を利用して全てのデータベースをダンプするにはスーパーユーザー権限を持つデータベース・ユーザーで実行する必要があります。
    • 参照 => pg_dumpall ~ PostgreSQL 7.4.6 文書

pg_dumpall の定期実行.

pg_dumpall ではクラスタ全てを一つのダンプファイルで書き出す事が出来るため、アカウント情報を含む全ての環境をバックアップする際に使用します。全てのデータベースに対して権限を持つスーパーユーザーで実行する必要があります。

定期的にpg_dumpall による自動バックアップを行うには、求められるユーザーとパスワードを自動的に入力する必要があります。ここでは、phpPgAdmin を利用しているため自ホストに対し trust を使用する事は出来ませんし、スーパーユーザーに限らず認証なしというのはセキュリティの観点から行うべきではありません。

.pgpass を利用した自動認証

実行ユーザーのホームディレクトリに認証情報を含む .pgpass ファイルを設置することで認証の自動化が可能になります。

参照 => パスワードファイル ~ PostgreSQL 7.4.6 文書

Linux のシステムアカウントである hogehoge ユーザーによるバックアップ を例に説明します。 /home/hogehoge に .pgpass ファイルを設置します。

$ cd ~
$ touch .pgpass
$ chmod 600 .pgpass
$ vi .pgpass

必ずパーミッションは 600 に設定します。他のユーザーが読めてはスキップされ、認証が求められます。

localhost:5432:*:postgres:パスワード

.pgpass の書式は以下の通りです。 コロンで区切ります。

ホスト:ポート:データベース:ユーザー:パスワード
hostname:port:database:username:password

~/.pgpass

localhost:5432:*:postgres:パスワード

もし、他の PostgreSQL ユーザーで pg_dump を使用し、特定のデータベースを dump したい場合は、改行して複数行にわたって記述します。ポイントは pg_dumpall で指定したユーザーやデータベース、ホスト名が一致しなければスキップされるので制限したくない場合は " * " ワイルドカードで指定するようにします。

ネットワーク上にある PostgreSQL サーバのデータベースをリモートでバックアップしたい場合は、localhosot と指定せず、* と指定する事で通ります。或いは複数行にわたって .pgpass で指定するのかもしれません。(未確認)

フルダンプの実行

~/.pgpass が設置できたら、pg_dumpall で PostgreSQL サーバー全体のダンプが取れるか確認します。(PostgreSQLサーバを停止させる必要はありません)

$ pg_dumpall -h localhost -U postgres -c > pg_dumpall.dump

ユーザーと指定したホストが ~/.pgpass と一致しなければ認証が求められます。 pg_dumpall.dump がパスワードを要求せず、エラー無く作成されればOKです。尚、指定したオプションとよく使うオプションは以下の通りです。

その他、詳細はドキュメントを参照して下さい。

option 内容
-h バックアップ対象ホストを指定します。
-U 実行するユーザーを指定します。
(スーパーユーザー権限をもつユーザ)
-c 復元する際、一度データベースを削除する
スクリプトをdumpファイルに含めます。
よく利用するオプション
-s スキーマ(構造)のみをダンプし、データはダンプしません。
(データ未入力状態に戻したい時など)

sh スクリプト作成例

pg_dumpall が問題なく動作したら sh 実行ファイルを作成し、cron デーモンで定期的に実行するだけです。システム管理者である hogehoge ユーザー権限で実行する場合の例です。

/home/hogehoge/Maintenance.sh/pg_dumpall.sh

$ cd ~
$ mkdir Maintenance.sh
$ cd Maintenance.sh
$ touch pg_dumpall.sh
$ chmod 700 pg_dumpall.sh
$ vi pg_dumpall.sh

適当なエディタで以下を記述します。

/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デーモンで定期的に実行すれば指定した時間に定期的にバックアップが行えるようになります。

cron デーモンによる定期実行

上記、pg_dumpall.sh を hogehoge (Unixユーザ) が定期的に実行する場合、crontab で以下のように指定します。

/etc/crontab

45 4 * * * hogehoge /home/hogehoge/Maintenance.sh/pg_dumpall.sh

この例では、毎朝 4時 45分 に pg_dumpall.sh を hogehoge ユーザーが実行します。

pg_dump の実行例.

pg_dumpall の復元はデータベース全体に影響を及ぼすため、データベース単位でのバックアップ作業も併せて必要になります。データベース単位でバックアップを行うには、pg_dump ユーティリティを使用します。

pg_dump の自動実行

先ほどと同じ、Unix 管理者である hogehoge が特定のデータベースユーザー権限で pg_dump を自動的に実行させる例です。同様に、~/.pgpass にユーザーとパスワードを記述する訳ですが、複数行に渡って指定することで認証を自動化することが出来ます。

~/.pgpass

localhost:5432:*:postgres:パスワード
localhost:5432:phpGroupWare:phpgw:パスワード

phpgw は、phpGroupWare をインストールする際に作成した専用ユーザーです。 以下の以下は hogehoge ユーザーがデータベース "phpGroupWare" を pg_dump-phpGroupWare.dump というファイルに出力する例です。

$ pg_dump phpGroupWare -h localhost -U phpgw -c > pg_dump-phpGroupWare.dump

オプションに関する詳細はドキュメントを参照して下さい。 多くは pg_dumpall と共通しています。 同様に sh 実行ファイルを作成して定期的に実行すればデータベース単位でバックアップが取れます。

/home/hogehoge/Maintenance.sh/pg_dump-phpGroupWare.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 文書

次のページでは、ここで作成したダンプファイルの復元作業の具体例を示します。

bottom_mark
ページ最上部
ページ最上部 前のページ