PostgreSQLのバックアップとリストア【pg_dump,pg_dumpall,pg_restore】

PostgreSQL

概要

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コマンドの使用例(バックアップ・リストア)

それでは、「pg_dump」コマンドを使用してSQLスクリプトファイルを出力してみます。
以下の例では、ユーザ「testuser1」でデータベース「testdb1」のダンプをファイル名「testdb1_dmp.sql」に出力します。

pg_dump -U testuser1 -f testdb1_dmp.sql testdb1

ユーザの指定に関しては、ダンプを取る全てのテーブルについて読み取り権限が必要です。
なお、「-f」オプションを指定しないと標準出力に出力されます。
実際に実行すると以下のようになります。

pg_dump SQLスクリプト出力

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

pg_dump 出力ファイル(SQL)
pg_dump 出力ファイル(SQL)

出力したSQLスクリプトファイルを使用してデータベースをリストアするには、「psql」コマンドに読み込ませます。
下記の例ではユーザ「testuser1」でデータベース「testdb1」にリストアを実施しています。

psql -U testuser1 testdb1 < testdb1_dmp.sql

実際に実行すると以下のようになります。

psql リストア(SQL)

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

psql リストア結果(SQL)

なお、上記の例ではリストアする前にテーブルを「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_restoreコマンドの使用例(バックアップとリストア)

まず、事前に「pg_dump」コマンドにてカスタム形式でバックアップ(ダンプ)を取得しておきます。
下記の例ではユーザ「testuser1」でデータベース「testdb1」をカスタム形式でバックアップを取っています。出力ファイル名は「testdb1.dmp」です。

pg_dump -U testuser1 -F custom -f testdb1.dmp testdb1

実際に実行すると以下のようになります。

pg_dump カスタム形式

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

pg_dump カスタム形式 verbose

それでは、「pg_restore」コマンドにてリストアします。
下記の例ではユーザ「testuser1」でデータベース「testdb1」にファイル「testdb1.dmp」を使ってリストアします。

pg_restore -c -v -U testuser1 -d testdb1 testdb1.dmp

「-v」オプションを指定しているので、標準エラー出力に進行状況が出力されます。

pg_restore カスタム形式

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

pg_restore リストア結果

データクラスタ内のすべてのデータベースのバックアップとリストア

データベースクラスタ内の全データベースのバックアップを一度に取得するには「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コマンドの使用例(バックアップ・リストア)

それでは「pg_dumpall」コマンドを使用してみます。
接続ユーザはスーパーユーザである「postgres」にて行います。

pg_dumpall -U postgres -c > fulldmp.sql

「-f」オプションを省略しているため、標準出力にSQLスクリプトが出力されます。リダイレクトにより「fulldump.sql」に出力しています。
また、「-c」オプションによりデータベース再作成前に対象データベースを削除するコマンドも出力されます。

実際に実行すると以下のようになります。

pg_dumpall 全体バックアップ

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

pg_dumpall 出力結果(SQL)
pg_dumpall 出力結果(SQL)

データベースの再作成より前に「DROP DATABASE」や「DROP ROLE」が出力されています。

出力されたSQLスクリプトを使用してデータベースをリストアするには、「psql」に読み込ませます。

psql -U postgres < fulldmp.sql

接続にはスーパーユーザである「postgres」を使用しています。
実際に実行すると以下のようになります。

pg_dumpall リストア
pg_dumpall リストア

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

pg_dumpall リストア結果

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

タイトルとURLをコピーしました