論理バックアップ(pg_dump と pg_dumpall)

論理バックアップ(pg_dump と pg_dumpall)

NTT オープンソースソフトウェアセンタ 鈴木 幸市

 

3. 論理バックアップとリストア

論理バックアップを行うツールは pg_dump 及び pg_dumpall です。 pg_dump は PostgreSQL データベースクラスタの各データベース単位にバックアップを行います。pg_dumpall はターゲットのデータベースクラスタに格納してある全データベースのバックアップを行います。 pg_dump も pg_dumpall も、バックアップデータはデータベースを復元するために必要な SQL 文で構成されます。 従って、pg_dump や pg_dumpall を使うと PostgreSQL データベースの内容を別なデータベースに移行したり、特定のテーブルだけをバックアップしたりすることが可能となります。

pg_dump, pg_dumpall を使うためには特別な用意はいりませんが、データベースは運転中でなければなりません。 データベースが運転中であることは、pg_ctl status コマンドで調べることができます。

$ pg_ctl status
pg_ctl: server is running (PID: 5913)
/usr/local/pgsql/bin/postgres

pg_dump, pg_dumpall でデータベースのバックアップを取得するには、データベースの全てのデータの読み取り権限を持つユーザで行う必要があります。そのため、一般的には、管理者(スーパーユーザ)でバックアップを行うことになります。

3.1 pg_dumpによるバックアップ

pg_dump に与える引数は、オプションとバックアップするデータベースです。 オプションを使うとバックアップするテーブルを選択したり、きめ細かなバックアップが可能となります。

この解説に移る前に、pg_dump が作るバックアップの形式について説明します。 pg_dumpは3種類の形式のバックアップを作ることができます。 形式の指定は pg_dump の -F (--format) オプションを使います。

オススメの形式は、カスタムアーカイブ形式 (-Fc) です。 サイズを圧縮できる上に、リストアの際に必要なテーブルやスキーマ定義だけを分離することができるためです。 また、必要であればカスタムアーカイブ形式のバックアップファイルをプレーンテキスト形式に後から変更することもできるため、いざという場合にはプレーンテキスト形式と同様、SQL 文を手作業で編集することもできます。

1) プレーンテキスト形式

プレーンテキストの SQL 文によるスクリプトを作成します。これがデフォルトの動作です。 この形式で作成したバックアップをリストアするには、pg_restore コマンドではなく psql コマンドを使用します。

例は次の通りです。

$ pg_dump --format=plain mydb > mydb_dump.sql
2) カスタムアーカイブ形式

バイナリ形式のバックアップを作成します。 この形式で作成したバックアップをリストアするには、 pg_restore コマンドを使用します。

例は次の通りです。

$ pg_dump --format=custom mydb > mydb_dump.custom

この形式では、バックアップは自動的に圧縮されます。 圧縮したバックアップをリストアする際には、pg_restoreが直接処理します。 これでバックアップを格納するストレージを節約することができます。

3) tar形式

カスタムアーカイブ形式と同様に pg_restore でリストアできる形式のバックアップを作成します。

例は次の通りです。

$ pg_dump --format=tar mydb > mydb_dump.tar

このファイルの構造を見てみます。

$ tar tvf mydb_dump.tar
-rw------- 2048/1024      5098 2009-11-05 17:00:48 toc.dat
-rw------- 2048/1024     68108 2009-11-05 17:00:48 1783.dat
-rw------- 2048/1024        86 2009-11-05 17:00:48 1785.dat
-rw------- 2048/1024       173 2009-11-05 17:00:48 1784.dat
-rw------- 2048/1024      4953 2009-11-05 17:00:48 restore.sql

toc.dat はテーブルの構造を定義しています。

restore.sqlは、リストア時に実行するSQLなどのコマンド群を格納しています。

これ以外のファイルはそれぞれのテーブルのデータが格納されています。

4) その他の特徴

pg_dump は PostgreSQL のクライアントツールなので、PostgreSQL に接続できる環境であればデータベースのバックアップが取得できます。 そのためには、環境変数でデータベースへの接続方法、ユーザ名などを指定する必要があります。 詳細は、 pg_dump のマニュアルページ 及び 環境変数のマニュアルページ に記述があります。

pg_dump には多くのオプションがありますが、上記の形式指定以外のほとんどはバックアップに含めるべきデータベースの内容を指定するものです。 詳細は上記のpg_dumpのページをご覧下さい。

3.2 pg_dumpall によるバックアップ

pg_dumpall コマンドを使うと、ターゲットのデータベースクラスタに格納してある全データベースのバックアップをとることができます。

デフォルトではターゲットの全データベースの全ての内容をバックアップとして取得します。 取得できるバックアップの形式はプレーンテキスト形式のみです。

例は次の通りです。

$ pg_dumpall > mydb_dumpall.sql

pg_dumpallもpg_dumpと同様 PostgreSQL のクライアントツールなので、リモートからバックアップを取得することが可能です。

オプションも多くありますが、その多くはバックアップに含めるべきスキーマやロールといったデータベースの要素を指定するものです。 詳細は pg_dumpallのマニュアルページ を参照してください。

3.3 psql によるリストア

pg_dumpall あるいは pg_dump でプレーンテキスト形式の SQL スクリプト形式で取得したバックアップからリストアするには psql コマンドを使います。 バックアップの内容はデータベースをリストアするのに必要なSQL文の並びなので、psqlにこのファイルを読み込ませることでリストアできます。

たとえば、3.1 1)で取得したバックアップをリストアするには

$ psql -f mydb_dump.sql

となります。

3.4 pg_restore によるリストア

pg_dump でカスタムアーカイブ形式あるいはtar形式で取得したバックアップからリストアするには、pg_restore プログラムを使います。

pg_restore にも多くのオプションがありますが、その多くはバックアップに含まれるデータベースのさまざまな要素(スキーマ、データ、インデックス定義など)のどれをリストアするかを指定するためのものです。 ここでは、もっとも基本的な操作であるバックアップした全てのデータをリストアする例を示します。

$ pg_restore -C -d postgres < mydb_dump.custom

上記の例では、リストアする際にデータベースを新たに作成すること、及び、リストア作業をする際にはデータベース postgres (デフォルトで必ず作成されるデータベース)を使うことを指定しています。 詳細な使い方については、 pg_restoreのマニュアル を参照してください。


(2010年3月9日 公開)