論理バックアップ(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のマニュアル を参照してください。