JSPで行こう!

PostgreSQLのリストア

 PostgreSQL のバックアップデータをリストアする手順です。
データ移行にも使えます。
やり方はいろいろあるので一例です。

PostgreSQL のリカバリー要件

何らかの障害が発生しデータが損傷した場合のリカバリーですが、要件によって方法も変わります。

一部のデータについては一般化はできませんが、
データベース単位、テーブル単位であればバックアップから戻すのが普通だと思います。
クリティカルなシステムで直前の状態まで戻すロールフォワードリカバリーが必要となる場合もありますが、
実際に行おうとすれば、事前にかなり緻密な計画が必要です。

ツールの使用
昔から、PostgreSQL には、PgAdmin という GUI のツールがあります。
ただ、pgAdminⅢまでは Windows アプリだったものが、pgAdmin 4 で web ベース(node.jsベースで重い!)に変わって使い方も全く変わってしまいました。
という事で標準コマンドで行うほうが確実です。

PostgreSQL のバックアップ

手順については別の記事で書いていますので、そちらを参考にしてください。
カスタム形式 でバックアップを取得してある事を前提にします。

データベース単位のリストア

 念のためバックアップしたデータの内容を確認しておきます。

以下は、testdb という名前のデータベースを testdb.custom というファイル名でカスタム形式でバックアップした想定です。

# su - postgres
$ pg_restore -l testdb.custom

データベース名、テーブル名、ACL 等の情報がある事を確認できると思います。
データベースを戻す場合、既に存在しているかいないかで操作も変わります。
存在している場合、一度クリアして置き換える必要があり、-c オプションを指定します。

ケース1:存在するデータベースを全て置き換える場合

$ pg_restore -d testdb -c testdb.custom


ケース2:データベースが無い状態で戻す場合

存在しない場合は、-C (大文字)を指定します。

$ pg_restore -d postgres -C testdb.custom

-d のデータベース名の指定に気を付けて下さい。
データベースが存在していないので、testdb は指定できません。
一応は、postgres というデータベースは initdb で作られ必ず存在しますからこれで良いのですが紛らわしいところがあります。
あと、データベースの所有者(owner)が、postgres で無い場合もあります。
ユーザーが登録されていれば良いですが、無い場合は警告が出ますが、postgres が owner としてデータベースは作成されます。

最後に、戻したら確認します。

$ psql

postgres=# \l
                                                 List of databases
   Name    |  Owner   | Encoding |   Collate   |    Ctype    | ICU Locale | Locale Provider |   Access privileges
-----------+----------+----------+-------------+-------------+------------+-----------------+-----------------------
 postgres  | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |            | libc            |
 template0 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |            | libc            | =c/postgres          +
           |          |          |             |             |            |                 | postgres=CTc/postgres
 template1 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |            | libc            | =c/postgres          +
           |          |          |             |             |            |                 | postgres=CTc/postgres
 testdb    | postgres | UTF8     | ja_JP.utf8  | ja_JP.utf8  |            | libc            |
(4 rows)

テーブル単位で戻す

 カスタム形式でバックアップを取っている場合、テーブル単位で復元する事も可能です。
これは実務の上では大変便利です。アプリケーションの障害やオペレーションの間違いで一部のデータが消失する事は良くあります。
こういった場合、データベース全体を戻す事はまれです。

例として、testdb の test_t というテーブルを戻す場合を見てみます。
状態も、既にテーブルが存在する場合と、存在しない場合が想定されます。
既にテーブルがある場合は、クリアする必要があり、-c オプションが必要です。

$ pg_restore  -d testdb -t test_t -c testdb.custom

注意するのが、データベース名は postgres ではなく、テーブルを復元する先のデータベース名です。
バックアップファイルの元のデータベース名に関わらず、任意のデータベースにテーブル単位で復元できる訳です。
なお、テーブルを drop したりして存在していなければ、-c オプションは外します。

さらに、データだけを戻す事も可能です。

$ pg_restore  -d testdb -t test_t --data-only testdb.custom

-c オプションと異なるのは、既存のデータはそのままで、バックアップしておいたデータがそれに追加されます。

Windows の場合

 基本は同じですが、管理者ユーザー(postgres)が OS での認証(peer認証)で行えないので、
-U postgres の指定と、PGPASSWORD 環境変数にパスワードを設定しておく必要があります。
conf/pg_hba.conf ファイルの認証に "trust" を設定すればパスワードは不要になりますが、セキュリティ上は好ましくありません。

« 前頁 次頁 »