バックアップとPostgreSQLのバージョンアップ

(2010.11.15) ページを分割。

# PostgreSQLのメジャーバージョンアップ

(2008.5.23追記。)

Linuxディストリビューションを更新 (update) した場合、PostgreSQLのメジャーバージョンが上がることがあります。このときは、データベースのバックアップ、復元(リストア)をおこなわなければなりません。

Fedora Linux では、データベースのデータは、デフォルトで、/var/lib/pgsql ディレクトリ以下に保存されます。

1. バックアップ

バージョンアップ前に、後述する pg_dump をしておきます。

(2017.7.30)
Fedora Linux のバージョンによっては, ディストリビューションのアップグレード後, postgresql-setup --upgrade コマンドで追従できることもある。でも、うまくいくか心配なので、やっぱりバックアップは必須。

2. リストア

PostgreSQL のバージョンアップが終わったら, initdb します。

  1. 古いDBデータを退避します。
    # su postgres
    $ mv /var/lib/pgsql/data /var/lib/pgsql/data.old
    
  2. initdb します。

    Fedora 26 Linux の場合は, rootユーザで次のようにします。

    # postgresql-setup --initdb
    

    あるいは, 'postgres' UNIXユーザで次のようにするか、

    $ initdb /var/lib/pgsql/data
    

    rootで次のようにします。

    # /etc/rc.d/init.d/postgresql initdb
    
  3. pg_hba.conf ファイルなどを適宜、修正します。
  4. 後述する pg_restore, psql などでデータを復元します。

# データベースのバックアップ

(2007.7.20更新。)

PostgreSQLのデータベースをバックアップする場合、特定のデータベースのみバックアップする方法と,すべてのデータベースをバックアップする方法があります。

PostgreSQLは、バージョン番号の二つ目の数字が変わると,内部的なデータ保存形式が変更されます。したがって,例えばv7.2.xからv7.3へのアップデートでは,いったんデータベースをすべてバックアップし,新しいバージョンのPostgreSQLをインストールしてから復元する必要があります。

すべてのデータベースをバックアップするには,pg_dumpallコマンドを実行します。

$ pg_dumpall > 出力ファイル

ラージオブジェクト (BLOB, CLOB) もデフォルトで保存されます (Fedora 7 LinuxのPostgreSQLバージョン8.2.4)。以前はラージオブジェクトは保存されなかったように思うのですが、気のせいかもしれません。

一つのデータベースのみをバックアップするときは、pg_dumpコマンドを使います。次のようにします。

$ pg_dump mydb > mydb.sql

あるいはpg_restoreへの入力に適した形式(カスタム形式; 圧縮される)で出力します。

$ pg_dump -Fc mydb > mydb.dump

# 復元 (リストア)

バックアップデータのリストアの仕方は、バックアップデータのデータ形式によって異なります。

pg_dumpall (オプションなし) で生成したファイルは、

$ psql -f db.out postgres

pg_dump (オプションなし) で生成したファイルは、データベースを指定して、

$ psql -d newdb -f db.sql

カスタム形式で生成したファイルは、pg_restore コマンドで復元します。

あらかじめ、ロール (データベースユーザ), データベースを作成しておかなければなりません。

$ pg_restore -h localhost -U postgres -d newdb db.dump