PostgreSQL 9.0の全データを9.3に移行する
目次
概要
PostgreSQL 9.0で運用していた全データ(データベースクラスタ)をPostgreSQL 9.3へ移行します。
PostgreSQL 9.0を運用していたLinuxサーバとは別に、新規のLinuxサーバを構築し、 PostgreSQL 9.3をインストールしました。 そこに initdb コマンドでデータベースクラスタを新規作成し、PostgreSQL 9.0で取得した論理バックアップをリストアします。 移行するものはデータベースだけでなく、ロールなども含まれます。 ただし、PostgreSQLの設定ファイル(postgresql.confやpg_hba.conf)は移行されません。
移行されるもの
- ロール(ユーザ)
- データベース(テーブル、権限など)
構成
サーバ構成
OSバージョン
【移行元】
Red Hat Enterprise Linux 5.9 x86_64
【移行先】
CentOS 6.5 x86_64
ソフトウェア・パッケージ一覧
【移行元】
postgresql90-9.0.13-1PGDG.rhel5.x86_64.rpm
postgresql90-libs-9.0.13-1PGDG.rhel5.x86_64.rpm
postgresql90-server-9.0.13-1PGDG.rhel5.x86_64.rpm
【移行先】
postgresql93-9.3.4-1PGDG.rhel6.x86_64.rpm
postgresql93-libs-9.3.4-1PGDG.rhel6.x86_64.rpm
postgresql93-server-9.3.4-1PGDG.rhel6.x86_64.rpm
手順
PostgreSQL 9.0でデータベースクラスタの論理バックアップ
まずは移行元のPostgreSQL 9.0でデータベースクラスタの論理バックアップを取得します。 論理バックアップには pg_dumpall コマンドを利用します。 なお、ここで物理バックアップを取得してはいけません。 PostgreSQLでは異なるバージョン間でデータの互換性が保証されないため、物理バックアップをリストアしても動かない可能性があります (本当に動かないかは試していません)。
# su - postgres -bash-3.2$ cd /bkup/ -bash-3.2$ pg_dumpall -f 20140721_pg_dumpall_pgdata1.sql
PostgreSQL 9.3でデータベースクラスタのリストア
論理バックアップファイルのコピー
PostgreSQL 9.0で取得した論理バックアップのファイルを 移行先であるPostgreSQL 9.3が稼働するサーバにコピーします。 コピー方法はftp、scp、rsyncなどリモートコピーのコマンドであれば何でも良いです。 以下では移行先のLinuxサーバにおいて、scpコマンドでファイルを /bkup/ ディレクトリ配下にコピーしています。
# cd /bkup/
# scp -p 192.168.0.75:/bkup/20140721_pg_dumpall_pgdata1.sql .
root@192.168.0.75's password: ←パスワードを入力
20140721_pg_dumpall_pgdata1.sql 100% 134KB 134.2KB/s 00:00
データベースクラスタのリストア
コピーした論理バックアップのファイルをリストアします。
# su - postgres
-bash-4.1$ cd /bkup/
-bash-4.1$ psql -f ./20140721_pg_dumpall_pgdata1.sql
データベース "postgres" にユーザ"postgres"として接続しました。
SET
SET
SET
CREATE ROLE
(中略)
ALTER TABLE
REVOKE
REVOKE
GRANT
GRANT
リストアの途中でエラーが1件出ました。 エラーメッセージは以下の通りで、 postgres ユーザが既に存在するというものでした。
psql:./20140721_pg_dumpall_pgdata1.sql:17: ERROR: role "postgres" already exists
移行先でもスーパーユーザとして postgres ユーザが既に存在しているのは 分かっているので特に問題ありません。なお、エラーが出てもリストアは止まりません。
移行後のデータの確認
まずはロール(ユーザ)が移行されたか確認します。 以下では一般ユーザとして phpuser と user1 がリストアされています。
-bash-4.1$ psql -c "\du" ロール一覧 ロール名 | 属性 | メンバー ----------+----------------------------------------------------------------------+---------- phpuser | | {} postgres | スーパーユーザ, ロールを作成できる, DBを作成できる, レプリケーション | {} user1 | | {} -bash-4.1$
次にデータベースを確認します。 postgresとtemplate0、template1の3つはPostgreSQLをインストールすると標準で作成されるものです。 以下では一般ユーザ用のデータベースとして phpdb と testdb1 2つがリストアされています。
-bash-4.1$ psql -l データベース一覧 名前 | 所有者 | エンコーディング | 照合順序 | Ctype(変換演算子) | アクセス権 -----------+----------+------------------+----------+-------------------+----------------------- phpdb | phpuser | UTF8 | C | C | postgres | postgres | UTF8 | C | C | template0 | postgres | UTF8 | C | C | =c/postgres + | | | | | postgres=CTc/postgres template1 | postgres | UTF8 | C | C | postgres=CTc/postgres+ | | | | | =c/postgres testdb1 | user1 | UTF8 | C | C | (5 行) -bash-4.1$
最後にデータベース毎のオブジェクト(テーブル、ビュー、シーケンス)がリストアされているか確認します。 以下はデータベース phpdb のオブジェクト。
-bash-4.1$ psql -U phpuser -c "\d" phpdb
ユーザ phpuser のパスワード: ←phpuserのパスワードを入力(表示されない)
リレーションの一覧
スキーマ | 名前 | 型 | 所有者
----------+----------------------------+----------+---------
public | mst_event | テーブル | phpuser
public | mst_group | テーブル | phpuser
public | mst_project | テーブル | phpuser
public | mst_project_classification | テーブル | phpuser
public | mst_project_code | テーブル | phpuser
public | mst_project_phase | テーブル | phpuser
public | mst_project_sub_code | テーブル | phpuser
public | mst_request | テーブル | phpuser
public | mst_system | テーブル | phpuser
public | mst_user | テーブル | phpuser
public | trn_progress | テーブル | phpuser
(11 行)
-bash-4.1$
続いてデータベース testdb1 のオブジェクト。
-bash-4.1$ psql -U user1 -c "\d" testdb1
ユーザ user1 のパスワード: ←user1のパスワードを入力(表示されない)
リレーションの一覧
スキーマ | 名前 | 型 | 所有者
----------+-----------+----------+--------
public | tbl1 | テーブル | user1
public | trn_event | テーブル | user1
public | trn_group | テーブル | user1
public | trn_point | テーブル | user1
public | trn_user | テーブル | user1
(5 行)
-bash-4.1$
一通りリストアされていることを確認できました。