pg_dumpはPostgreSQLデータベースをバックアップするユーティリティです。 データベースを使用中であっても一貫性のあるバックアップを作成することができます。 pg_dumpは他のユーザによるデータベースへのアクセス(読み書き)をブロックしません。
ダンプ(抽出)は、スクリプト形式、または、アーカイブファイル形式で出力することができます。 スクリプトダンプは、保存時の状態のデータベースを再構成するために必要なSQLコマンドが書き込まれたプレインテキストファイルです。 このスクリプトを使ってリストアを行うにはpsqlを使用します。 スクリプトファイルを使えば、ダンプを行ったのとは別のマシンや別のアーキテクチャ上でも、データベースを再構築することができます。 また、多少編集すれば他のSQLデータベース製品上でもデータベースの再構築が可能です。
もう1つの形式であるアーカイブファイル形式を使ってデータベースを再構築するには、pg_restoreを使用しなければなりません。 このファイルを使用すると、pg_restoreがリストア対象を選択したり、リストアするアイテムを並び替えたりできます。 アーカイブファイルもまた、アーキテクチャを越えて移植できるように設計されています。
いずれかのアーカイブファイル形式をpg_restoreと組み合わせて使用する場合は、pg_dumpの柔軟なアーカイブ/転送機構が利用できます。
具体的には、pg_dumpを使用してデータベース全体をバックアップし、pg_restoreを使用して、アーカイブの内容を検査したり、データベースの一部を選択してリストアしたりすることができます。
最も柔軟な出力ファイル形式は、"custom"形式(-Fc
)です。
この形式では、デフォルトで圧縮されます。また、保存された項目の選択や並び換えを行うことができます。
tar形式(-Ft
)は圧縮されません。また、ロードの際に並び替えを行うことができません。
しかし、他の点では、かなり柔軟です。
さらに、tarなどの標準的なUnixツールを使用して操作することができます。
pg_dumpの実行中は、標準エラーに出力される警告(特に後述の制限に関する警告)が出力されていないか確認してください。
以下のコマンドラインオプションは出力形式とその内容を制御します。
ダンプ(抽出)するデータベースの名前を指定します。 指定されていない場合は、PGDATABASE環境変数が使われます。 この変数も設定されていない場合は、接続のために指定されたユーザ名が使用されます。
-a
--data-only
データのみをダンプし、スキーマ(データ定義)はダンプしません。
このオプションは、プレインテキスト形式の場合にのみ有効です。 アーカイブ形式では、pg_restoreを呼び出す時にこのオプションを指定することができます。
-c
--clean
データベースオブジェクトを作成するコマンドの前に、データベースをクリーンアップ(削除)するコマンドを書き出します。
このオプションは、プレインテキスト形式の場合にのみ有効です。 アーカイブ形式では、pg_restoreを呼び出す時にこのオプションを指定することができます。
-C
--create
初めにデータベース自体を作成するコマンドを出力し、その後、作成したデータベースに接続するコマンドを出力します (このようなスクリプトを使用すると、スクリプトを実行する前にどのデータベースに接続すればよいかという問題を考える必要がなくなります)。
このオプションは、プレインテキスト形式の場合にのみ有効です。 アーカイブ形式では、pg_restoreを呼び出す時にこのオプションを指定することができます。
-d
--inserts
データを(COPYではなく)INSERTコマンドの形式でダンプします。
これを行うとリストアに非常に時間がかかります。
主にPostgreSQL以外のデータベースへロード可能なダンプを作成する時に有用です。
列の順序を変更した場合はリストアが失敗する可能性があることに注意してください。
-D
の方がより処理が遅くなりますが、安全です。
また、無効なデータのためにこの操作がエラーになっても、他のINSERT文は継続してテーブルにデータをロードすることができます。
-D
--column-inserts
--attribute-inserts
明示的に列名を付けたINSERTコマンド(INSERT INTO table (column, ...)VALUES...)としてデータをダンプします。 これによりリストアは非常に遅くなります。 主にPostgreSQL以外のデータベースへロード可能なダンプを作成する時に有用です。 また、無効なデータのためにこの操作がエラーになっても、他のINSERT文は継続してテーブルにデータをロードすることができます。
-E encoding
--encoding=encoding
指定した文字セット符号化方式でダンプを作成します。 デフォルトでは、ダンプはデータベースの符号化方式で作成されます (PGCLIENTENCODING環境変数を好みのダンプ時の符号化方式に設定することで、同じ結果を得ることができます)。
-f file
--file=file
出力を指定のファイルに送ります。 省略時は標準出力が使用されます。
-F format
--format=format
出力形式を選択します。 formatには、以下のいずれかが入ります。
プレインテキストのSQLスクリプトファイルを出力します(デフォルト)。
pg_restoreへの入力に適したtarアーカイブを出力します。 このアーカイブ形式では、並び替えやデータベースオブジェクトを除外するデータベースのリストアを行うことができます。 また、リストア時にデータを選択してリロードすることもできます。
pg_restoreへの入力に適したカスタムアーカイブを出力します。 これは、最も柔軟な形式であり、オブジェクト定義やロードするデータを並び替えることができます。 また、この形式はデフォルトで圧縮されます。
-i
--ignore-version
pg_dumpとデータベースサーバのバージョンの不一致を無視します。
pg_dumpは、以前にリリースされたPostgreSQLデータベースも処理できますが、(現時点では7.0より前の)非常に古いバージョンのデータベースはサポートしていません。 バージョンチェックを無効にする必要がある場合には、このオプションを使います(この場合、pg_dumpが失敗しても、警告がなかったとは言わないでください)。
-n schema
--schema=schema
schemaで指定した内容のみをダンプします。 このオプションが指定されなければ、対象データベース内にあるシステム以外のスキーマ全てがダンプされます。
注意: このモードでは、pg_dumpは選択したスキーマ内のオブジェクトが依存する可能性がある他のデータベースオブジェクトのダンプを行いません。 したがって、スキーマ単体のダンプの結果を初期化されたデータベースに正常にリストアできるかどうかの保証はありません。
-o
--oids
各テーブルのオブジェクト識別子(OID)をデータの一部としてダンプします。 アプリケーションでOID列を(外部キー制約など)何らかの形で使用している場合は、このオプションを使用してください。 その他の場合は、このオプションは使用しないでください。
-O
--no-owner
オブジェクトの所有権を元のデータベースに一致させるためのコマンドを出力しません。
デフォルトでは、pg_dumpは、ALTER OWNER文またはSET SESSION AUTHORIZATION文を発行して、作成したデータベースオブジェクトの所有権を設定します。
スーパーユーザ(もしくは、そのスクリプト内の全てのオブジェクトを所有するユーザ)以外のユーザがスクリプトを実行した場合、これらの文は失敗します。
任意のユーザがリストアできるスクリプトを作成するには、-O
を指定してください。
ただし、この場合は、全てのオブジェクトの所有者がリストアしたユーザとなってしまいます。
このオプションは、プレインテキスト形式の場合にのみ有効です。 アーカイブ形式では、pg_restoreを呼び出す時にこのオプションを指定することができます。
-R
--no-reconnect
このオプションは廃止されましたが、後方互換性を保持するため受け入れられます。
-s
--schema-only
データ定義(スキーマ)のみをダンプし、データはダンプしません。
-S username
--superuser=username
トリガを無効にする場合に使用する、スーパーユーザのユーザ名を指定します。
これは--disable-triggers
を使う場合にのみ使用されます
(通常は このオプションを使うよりも、出力されたスクリプトをスーパーユーザ権限で実行する方が良いでしょう)。
-t table
--table=table
tableのデータのみをダンプします。
同じ名前のテーブルが異なるスキーマに複数存在することがあり得ます。この場合、一致する全てのテーブルがダンプされます。
1テーブルのみを選択するには、--schema
と--table
の両方を指定してください。
注意: このモードでは、pg_dumpは選択したテーブル内のオブジェクトが依存する可能性がある他のデータベースオブジェクトのダンプを行いません。 したがって、テーブルのみのダンプ結果を初期化されたデータベースに正常にリストアできるかどうかの保証はありません。
-v
--verbose
冗長モードを指定します。 これを指定すると、pg_dumpは、詳細なオブジェクトコメント、開始時刻、終了時刻をダンプファイルに、進行状況メッセージを標準エラーに出力します。
-x
--no-privileges
--no-acl
アクセス権限(grant/revokeコマンド)のダンプを抑制します。
-X disable-dollar-quoting
--disable-dollar-quoting
このオプションは、関数本体用のドル引用符の使用を無効にし、強制的に標準SQLの文字列構文を使用した引用符付けを行います。
-X disable-triggers
--disable-triggers
このオプションは、データのみのダンプを作成する場合にしか適用されません。 データのリロード中に、pg_dumpに対し、対象テーブル上のトリガを一時的に無効にするコマンドを出力するよう指示します。 このオプションは、データのリロード中には呼び出したくない参照整合性検査やその他のトリガがテーブル上にある場合に使用します。
現在のところ、--disable-triggers
を指定してコマンドを実行するのは、スーパーユーザでなければなりません。
そのため、ユーザは-S
でスーパーユーザを指定するか、あるいは、十分に注意してスーパーユーザ権限でスクリプトを開始する必要があります(後者の方がより望ましい方法です)。
このオプションは、プレインテキスト形式の場合にのみ有効です。 他の形式では、pg_restoreを呼び出す時にこのオプションを指定することができます。
-X use-set-session-authorization
--use-set-session-authorization
オブジェクトの所有権を決定するために、ALTER OWNERコマンドの代わりに標準SQLのSET SESSION AUTHORIZATIONコマンドを出力します。 これにより、ダンプの標準への互換性が高まりますが、ダンプ内のオブジェクトの履歴によっては正しくリストアされない可能性が生じます。 また、SET SESSION AUTHORIZATIONを使用したダンプを正しくリストアするためには、確実にスーパーユーザ権限が必要となります。 ALTER OWNERで必要な権限はこれよりも少なくなります。
-Z 0..9
--compress=0..9
圧縮をサポートするアーカイブ形式で使用する、圧縮レベルを指定します(現時点では、カスタムアーカイブ形式のみが圧縮をサポートしています)。
以下のコマンドラインオプションは、データベース接続パラメータを制御します。
-h host
--host=host
サーバが稼働しているマシンのホスト名を指定します。 この値がスラッシュから始まる場合、Unixドメインソケット用のディレクトリとして使用されます。 デフォルトは、設定されていればPGHOST環境変数から取得されます。 設定されていなければ、Unixドメインソケット接続と仮定されます。
-p port
--port=port
サーバが接続を監視するTCPポートもしくはローカルUnixドメインソケットファイルの拡張子を指定します。 デフォルトは、設定されている場合、PGPORT環境変数の値となります。設定されていなければ、コンパイル時のデフォルト値となります。
-U username
指定したユーザとして接続します。
-W
強制的にパスワードのプロンプトを表示します。 これは、パスワード認証が必要なサーバの場合、自動的に行われます。
データベースクラスタにおいてtemplate1データベースに対しローカルな変更を行っている場合、pg_dumpの出力は、確実に空のデータベースにリストアするように注意してください。 そうしないと、おそらく追加されたオブジェクトの重複定義によってエラーが発生します。 ローカルな追加が反映されていない空のデータベースを作成するには、template1ではなくtemplate0をコピーしてください。 以下に例を示します。
CREATE DATABASE foo WITH TEMPLATE template0;
pg_dumpにはいくつかの制限があります。
--disable-triggers
オプションを使用し、データのみのダンプを行う場合、pg_dumpはデータを挿入する前にユーザテーブルにトリガを無効にする問い合わせを発行し、データの挿入が完了した後で、それらを再び有効にする問い合わせを発行します。
リストアが途中で停止した場合、システムカタログが不適切な状態のままになっている可能性があります。
tarアーカイブのメンバのサイズは、8ギガバイト未満に制限されています (これはtarファイル形式自体が持っている制限です)。 そのため、いずれか1つのテーブルのテキスト表現がこのサイズを越える場合、この形式は使用できません。 tarアーカイブとその他の出力形式の合計サイズには制限がありません。 ただしオペレーティングシステムによる制限がある場合があります。
pg_dumpが生成するダンプファイルには、オプティマイザが問い合わせ計画を決定する際に使用される統計情報が含まれていません。 そのため、十分な性能を発揮するために、ダンプファイルからリストアした後でANALYZEを実行することをお勧めします。
pg_dumpは新しいバージョンのPostgreSQLへのデータ移行に使用されますので、pg_dumpの出力は新しいバージョンのPostgreSQLデータベースへロードできるようになっています。 また、古いPostgreSQLデータベースを読み取ることもできます。 しかし通常、新しいPostgreSQL データベースの読み取りや古いバージョンのデータベースへロードするためのダンプ出力を生成することはできません。 これを行うには、おそらくダンプファイルの手作業による修正が必要になります。