バックアップとリストア

PostgreSQL 8.0.0 文書
前のページ | 巻戻し |  | 早送り | 次のページ

# 第 22章バックアップとリストア

貴重なデータを全て保存しているため、 PostgreSQL データベースは定期的にバックアップされなければなりません。 バックアップの手順は基本的に簡単ですが、底流にある技術といくつかの仮定となる条件を理解することは重要です。

PostgreSQLのデータをバックアップする時には基本的に以下の異なった3つの手法があります。

- SQL によるダンプ

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

- オンラインバックアップ

それぞれ長所と短所があります。

# 22.1. SQL によるダンプ

SQLによるダンプ方法の背景にある考え方はSQLコマンドでテキストファイルを生成し、そのファイルをサーバが再度読み込みを行った時に、ダンプした時点と同じ状態が再構築されるということです。 この目的のため、PostgreSQLはpg_dumpユーティリティプログラムを提供しています。 このコマンドの基本となる使い方は以下の通りです。

    pg_dump dbname > outfile

見てわかるとおり、pg_dump は結果を標準出力に書き出します。 これがどのように活用できるかをこれから説明してゆきます。

pg_dumpは、（すぐれた機能を特に発揮する）PostgreSQL の通常のクライアントアプリケーションです。 ということはデータベースに接続可能なあらゆるリモートホストからこのバックアップ手順を実行することができます。 しかし、pg_dump は特別な権限で動作しないことを覚えておいてください。 具体的にいうと、バックアップを行う全てのテーブルに対して読み込み権限が必要となります。 ですから、実際ほとんど常に、データベースのスーパーユーザでバックアップを実行しなければなりません。

pg_dumpを行うデータベースサーバを特定するにはコマンドラインの`-h `host``オプションと`-p `port``オプションを使用します。 デフォルトのホストはローカルホスト、または、`PGHOST`環境変数で指定されるものです。 同様に、デフォルトのポートは`PGPORT`環境変数 で指定されているか、うまく行かない場合にはコンパイル時の設定がデフォルトとなります。 （そこはうまくできていて、サーバは通常コンパイル時の設定をデフォルトとします。）

他のPostgreSQLのクライアントアプリケーションと同様に、pg_dumpはデフォルトで、オペレーティングシステムの現在のユーザ名と同じデータベースユーザ名で接続します。 これを無効にするには`-U`オプションを付けるか`PGUSER`環境変数を設定します。 pg_dumpの接続は（第19章で説明されている）通常のクライアント認証方法によることを思い出してください。

pg_dumpで作成されたダンプは、内部的に整合性があります。 つまり、pg_dumpが行われている際の更新はダンプには反映されないということです。 pg_dump が作動している時はデータベースに対する他の作業は妨げられません。 (`VACUUM FULL` などの、排他的なロックが必要な作業は例外です。）

> 重要項目: （例えば外部キーのように）データベーススキーマが OID に依存している場合 pg_dump に OID も一緒にダンプするよう指定しなければなりません。 これを行うには `-o` コマンドラインオプションを使用します。 デフォルトで "ラージオブジェクト"もダンプされません。 ラージオブジェクトを使用する場合pg_dumpのリファレンスページを参照してください。

## 22.1.1. ダンプのリストア

pg_dumpで作成されたテキストファイルは psql プログラムで読み込まれることを意図しています。 以下に、ダンプをリストアする一般的な方法を示します。

    psql dbname < infile

ここで`infile`はpg_dumpコマンドで`outfile`としたものです。 `dbname`データベースはこのコマンドでは作成されません。 (例えば `createdb -T template0 `dbname`` のようにして) psql を実行する前に自分で `template0` から作成してください。 psql には pg_dump と似たような、データベースサーバの場所とユーザ名を指定する機能があります。 詳細については、psqlのリファレンスページを参照してください。

リストアを実行する前に、対象のデータベースはもちろんダンプされたデータベース内のオブジェクトを所有するユーザやそのオブジェクト上に権限を与えられたユーザも存在しなければなりません。 存在していない場合、リストアはそのオブジェクトの元々の所有権や付与された権限を再作成することができません。 (このようにしたい場合もあるでしょうが、たいていは好まれません。)

リストアした後、オプティマイザが有用な統計情報を持つように、各データベースに対してANALYZEを実行することを勧めます。 簡単な方法は、`vacuumdb -a -z`を実行して全てのデータベースに対して`VACUUM ANALYZE`を行なうことです。 これは、手作業で`VACUUM ANALYZE`を実行することと同じです。

pg_dump と psql ではパイプから読み書きができるので、あるサーバから別のサーバへデータベースを直接ダンプできます。 以下に例を示します。

    pg_dump -h host1 dbname | psql -h host2 dbname

> 重要項目: pg_dump で作成されるダンプは `template0` から相対関係にあります。 つまり `template1` に追加されたあらゆる言語、手順なども pg_dump によりダンプされます。 その結果としてリストアする際に、カスタマイズされた `template1` を使用している場合は、上記の例のように、`template0` から空のデータベースを作成する必要があります。

効率的に大規模なデータをPostgreSQLにロードする方法に関する勧告については、項13.4を参照してください。

## 22.1.2. pg_dumpall の使用

上で説明した手法はデータベースクラスタ全てをバックアップする際に扱いにくく不適切です。 この理由でpg_dumpallプログラムが提供されています。 pg_dumpall は指定されたクラスタの各データベースのバックアップを行い、そして、ユーザやグループなどのクラスタ全体にわたるデータを保持します。 このコマンドの基本的な使用方法は

    pg_dumpall > outfile

です。 ダンプの結果は psql でリストアできます。

    psql template1 < infile

(実際、開始時に任意の既存のデータベース名を指定することができますが、空のクラスタ内に再ロードする場合は、`template1`が唯一の選択肢です。) ユーザとグループの情報をリストアしなければならないので、pg_dumpallのダンプをリストアする時には、データベーススーパーユーザのアクセス権限を確実に必要とします。

## 22.1.3. 大規模データベースの扱い

PostgreSQL はシステム上で最大可能なファイルサイズよりも大きなテーブルを扱えるので、ファイルにダンプする際に、システムで許容されているファイルサイズを越えてしまうという問題に遭遇する可能性があります。 pg_dump は標準出力に書き出しますので、この問題を解決するために Unix のツールを使用して回避できます。

圧縮ダンプの使用. gzip のような好みの圧縮プログラムを使うことができます。

    pg_dump dbname | gzip > filename.gz

元に戻すには次のようにします。

    createdb dbname
    gunzip -c filename.gz | psql dbname

あるいはこのようにもできます。

    cat filename.gz | gunzip | psql dbname

`split` の使用. `split` コマンドで結果を背後のファイルシステムで受け付けられる大きさに分割することができます。 例えば1Mバイトずつに分割するには次のようにします。

    pg_dump dbname | split -b 1m - filename

元に戻すには次のようにします。

    createdb dbname
    cat filename* | psql dbname

カスタムダンプ書式の使用. もし PostgreSQL が zlib 圧縮ライブラリインストール済みのシステム上で構築されたのなら、カスタムダンプ書式では出力ファイルに書き出す時にデータを圧縮します。 `gzip` を使用した時と似通ったダンプサイズとなりますが、テーブルの復元を部分的に行えるという点で優れているといえます。 以下のコマンドは、カスタムダンプ書式でのデータベースのダンプを行います。

    pg_dump -Fc dbname > filename

カスタム書式のダンプはpsql用のスクリプトではありませんので、代わりにpg_restoreでリストアしなければなりません。 詳細はpg_dumpとpg_restoreのリファレンスページを参照してください。

## 22.1.4. 警告

後方互換性の理由から、デフォルトで pg_dump はラージオブジェクトのダンプを行いません。 ラージオブジェクトのダンプを行うには、出力形式をカスタムもしくは tar 書式にする必要があり、また pg_dump に `-b` オプションを付ける必要があります。 詳細はpg_dumpのリファレンスページを参照してください。 PostgreSQL ソースツリーの `contrib/pg_dumplo` ディレクトリにもラージオブジェクトをダンプするプログラムがあります。

pg_dumpのリファレンスページを習熟してください。

前のページ | ホーム | 次のページ
ログファイルの保守 | 上に戻る | ファイルシステムレベルのバックアップ