OSS Fan ~OSSでLinuxサーバ構築~

作成日: 2014/07/21

Linuxサーバ管理

PostgreSQL 9.0の全データを9.3に移行する

トップページLinuxサーバ管理 > 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でデータベースクラスタのリストア

(1) 論理バックアップファイルのコピー

 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

(2) データベースクラスタのリストア

 コピーした論理バックアップのファイルをリストアします。

# 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 ユーザが既に存在しているのは 分かっているので特に問題ありません。なお、エラーが出てもリストアは止まりません。

(3) 移行後のデータの確認

 まずはロール(ユーザ)が移行されたか確認します。 以下では一般ユーザとして 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$

 一通りリストアされていることを確認できました。

プロフィール

らのっち

損害保険会社のIT企画部に勤務するSEです。OSSを勉強中です。

<所属>
日本PostgreSQLユーザ会とくしまOSS普及協議会

■■■ 当サイトは Internet Explorer 11 と Mozilla Firefox 43 で動作確認済みです。 ■■■