概要
PostgreSQLのデータベースのバックアップには、次の3つの方法があります。
- SQLによるダンプ
- ファイルシステムレベルのバックアップ
- 継続的アーカイブ
ここでは、論理的なバックアップの「SQLによるダンプ」による方法について説明します。
単一のデータベースのバックアップとリストア
1つのデータベースのバックアップを取る場合、「pg_dump」コマンドを使用します。
デフォルトではデータベースの内容をSQLスクリプトファイルとして出力します。
リストア時には、そのSQLスクリプトファイルを「psql」コマンドに読み込ませます。
また、「pg_dump」コマンドでは、SQLスクリプト以外にアーカイブファイルで出力することも可能です。
pg_dump
「pg_dump」コマンドは、PostgreSQLのデータベースをSQLスクリプトファイル、またはアーカイブファイルに出力します。
データベースが使用中であっても、一貫性のあるバックアップを作成することができます。また、他のユーザのデータベースへのアクセスをブロックすることもありません。
構文は以下の通りです。
pg_dump [接続オプション] [オプション] データベース名
「pg_dump」はデータベース名で指定された単一のデータベースしかダンプしません。クラスタ全体や全データベース共通のグローバルオブジェクト(ロールやテーブル空間など)をダンプしたい場合は、後述する「pg_dumpall」を使用します。
主なオプションには以下のものがあります。
オプション | 内容 |
---|---|
-a –data-only | データのみをダンプしデータ定義(スキーマ)はダンプしません。テーブルデータ、ラージオブジェクト、シーケンス値がダンプされます。 |
-c –clean | ダンプされたデータベースオブジェクトを出力する前に、それらすべてをDROPするコマンドを出力します。リストアの際、既存のデータベースを上書きする場合に便利です。 アーカイブファイル出力時は無効です。 |
-f filename –file=filename | filenameで指定されたファイルに出力します。 |
-F format –format=format | formatで指定した形式で出力します。以下のフォーマットが指定できます。 p または plain 平文のSQLスクリプトが出力されます。 c または custom pg_restoreに適したカスタム形式アーカイブが出力されます。 d または directory pg_restoreに適したディレクトリ形式アーカイブが出力されます。(並行ダンプをサポート) t または tar tar形式のアーカイブを出力します。 |
-s –schema-only | データ定義(スキーマ)のみを出力します。 |
-t pattern –table=pattern | patternにマッチする名前のテーブルのみ出力します。複数の「-t」オプションを記述することによって複数のテーブルを指定可能です。ワイルドカードを使用する際はパターンを引用符で括る必要があります。 |
-T pattern –exclude-table=pattern | patternにマッチする名前のテーブルを出力しません。複数の「-T」オプションを記述することによって複数のテーブルを指定可能です。 |
-v –verbose | 冗長モードを指定します。進行メッセージが標準エラー出力に出力されるようになります。 |
主な接続オプションは以下の通りです。
接続パラメータ | 内容 |
---|---|
-h host –host=host | PostgreSQLサーバが稼働しているホスト名・IPアドレスを指定する。 |
-p port –port=port | サーバが接続を監視するTCPポート番号を指定する。 |
-U username –username=username | 接続に使用するユーザ名を指定する。 |
pg_dumpコマンドの使用例(バックアップ・リストア)
それでは、「pg_dump」コマンドを使用してSQLスクリプトファイルを出力してみます。
以下の例では、ユーザ「testuser1」でデータベース「testdb1」のダンプをファイル名「testdb1_dmp.sql」に出力します。
pg_dump -U testuser1 -f testdb1_dmp.sql testdb1
ユーザの指定に関しては、ダンプを取る全てのテーブルについて読み取り権限が必要です。
なお、「-f」オプションを指定しないと標準出力に出力されます。
実際に実行すると以下のようになります。

「testdb1_dmp.sql」ファイルが出力されています。出力されたSQLスクリプトファイルは以下のような感じになります。


出力したSQLスクリプトファイルを使用してデータベースをリストアするには、「psql」コマンドに読み込ませます。
下記の例ではユーザ「testuser1」でデータベース「testdb1」にリストアを実施しています。
psql -U testuser1 testdb1 < testdb1_dmp.sql
実際に実行すると以下のようになります。

「psql」コマンドで見てみるとデータがリストアされています。

なお、上記の例ではリストアする前にテーブルを「DROP TABLE」して削除してあります。(テーブル作成時やデータコピー時にエラーとなるため。)
「pg_dump」する際に「-c」オプションをつけると、対象のオブジェクトを事前にDROPするコマンドも出力されるのでリストア時に上書き可能となります。
pg_restore
「pg_dump」コマンドにて、出力フォーマットを「カスタム形式アーカイブ」や「ディレクトリ形式アーカイブ」「tar形式アーカイブ」にした場合、「pg_restore」コマンドにてリストアを行います。
構文は以下の通りです。
pg_restore [接続オプション] [オプション] [ファイル名]
ファイル名を省略した場合は、標準入力からファイルをとりこみます。
主なオプションは以下の通りです。
オプション | 内容 |
---|---|
-a –data-only | データのみをリストアし、スキーマ(データ定義)はリストアしません。アーカイブ内にあるテーブルデータ、ラージオブジェクト、シーケンス値がリストアされます。 |
-c –clean | データベースオブジェクトをリストアする前に、リストアされるオブジェクトをDROPします。 |
-d dbname –database=dbname | dbnameで指定されたデータベースに接続し、このデータベースをリストアします。 |
-F format –format=format | アーカイブ形式のフォーマットを指定します。pg_restoreはフォーマットを自動認識するため、このオプションは必須ではありません。 フォーマットの指定は以下の通りです。 c または custom カスタム形式 d または directory ディレクトリ形式 t または tar tarアーカイブ |
-t table –table=table | 指定されたテーブルのみ、定義およびデータをリストアします。複数の「-t」オプションを指定することで複数のテーブルを指定できます。 |
-v –verbose | 冗長モードを指定します。進行メッセージを標準エラー出力に出力するようになります。 |
接続オプションは、「pg_dump」コマンドとほぼ同じです。
pg_restoreコマンドの使用例(バックアップとリストア)
まず、事前に「pg_dump」コマンドにてカスタム形式でバックアップ(ダンプ)を取得しておきます。
下記の例ではユーザ「testuser1」でデータベース「testdb1」をカスタム形式でバックアップを取っています。出力ファイル名は「testdb1.dmp」です。
pg_dump -U testuser1 -F custom -f testdb1.dmp testdb1
実際に実行すると以下のようになります。

「testdb1.dmp」ファイルが出力されています。
オプション「-v」をつけると進行状況が確認できます。

それでは、「pg_restore」コマンドにてリストアします。
下記の例ではユーザ「testuser1」でデータベース「testdb1」にファイル「testdb1.dmp」を使ってリストアします。
pg_restore -c -v -U testuser1 -d testdb1 testdb1.dmp
「-v」オプションを指定しているので、標準エラー出力に進行状況が出力されます。

「psql」コマンドで確認してみると、データがリストアされています。

データクラスタ内のすべてのデータベースのバックアップとリストア
データベースクラスタ内の全データベースのバックアップを一度に取得するには「pg_dumpall」コマンドを使用します。全データベースに共通する属性や全データベースのデータを読み込むため、基本的にはスーパーユーザとして接続する必要があります。
pg_dumpall
「pg_dumpall」コマンドは、PostgreSQLのデータベースクラスタ内のすべてのデータベースを1つのSQLスクリプトファイルに出力します。
「pg_dump」では出力されない全てのデータベースに共通するグローバルオブジェクトも出力されます。これにはユーザやグループの情報、データベース全体に適用するアクセス権限などの属性情報が含まれます。
すべてのデータベースからテーブルを読み込むため、基本的にはスーパーユーザとして接続する必要があります。
構文は以下の通りです
pg_dumpall [接続オプション] [オプション]
主なオプションは以下の通りです。
オプション | 内容 |
---|---|
-c –clean | データベースを再作成するコマンドの前に、データベースのクリーンナップ(削除)するコマンドを書きだします。 |
-f filename –file=filename | filenameで指定されたファイルに出力します。 |
接続オプションは「pg_dump」とほぼ同じです。
pg_dumpallコマンドの使用例(バックアップ・リストア)
それでは「pg_dumpall」コマンドを使用してみます。
接続ユーザはスーパーユーザである「postgres」にて行います。
pg_dumpall -U postgres -c > fulldmp.sql
「-f」オプションを省略しているため、標準出力にSQLスクリプトが出力されます。リダイレクトにより「fulldump.sql」に出力しています。
また、「-c」オプションによりデータベース再作成前に対象データベースを削除するコマンドも出力されます。
実際に実行すると以下のようになります。

「pg_dumpall」ではデータベースごとに接続が発生するため、パスワード認証を使用している場合は、都度パスワード入力を要求されます。
出力されたSQLスクリプトは以下の通りです。


データベースの再作成より前に「DROP DATABASE」や「DROP ROLE」が出力されています。
出力されたSQLスクリプトを使用してデータベースをリストアするには、「psql」に読み込ませます。
psql -U postgres < fulldmp.sql
接続にはスーパーユーザである「postgres」を使用しています。
実際に実行すると以下のようになります。


「psql」コマンドにて見てみると、データがリストアされています。

「pg_dump」「pg_dumpall」「pg_restore」コマンドによるPostgreSQLのデータベースバックアップ・リストアについては以上です。