PostgreSQLのデータベースをWindows (SJIS)からUbuntu (UTF8)に移植する方法

PostgreSQLのデータベースをWindows (SJIS)からUbuntu (UTF8)に移植する方法

この記事のまとめ:
  • Windowsで作成した文字コードがSJISのPostgreSQLのデータベースをUbuntuのUTF8のデータベースに移植した流れを記載しています。
背景:

当初、自宅にあるWindows PCでPostgreSQLを動かしていたのですが、どこの環境でもデータベースにアクセスできるようにした方が利便性が高かったので、Ubuntuが動くVPSに移植しようとしたところ、文字コードの問題にぶち当たってしまったのでとりあえず対処した作業手順を載せておきます。

はじめに:本記事での表記について

コマンドについて説明する機会が多々ありますが、それぞれどのターミナル上で実行しているかを区別するために文頭の記号ごとにそれぞれ下記を意味しています。

$  → Linuxターミナル上でのコマンド (一般ユーザーでのログイン中)
=# → PostgreSQL上でのコマンド (スーパーユーザーでログイン中)
=> → PostgreSQL上でのコマンド (一般ユーザーでのログイン中)
作業した流れ

おそらく回りくどいやり方をやっていると思いますので飽くまで参考としてご覧ください。

作業の流れは下記の通りです。

  1. pg_dumpallコマンドでWindows上のPostgreSQLのすべての情報をダンプ
  2. pg_restoreコマンドでダンプしたファイルをUbuntu上にリストア
  3. pg_dumpコマンドで文字コードを変更したいデータベースを一時退避
  4. dropdbコマンドで対象のデータベースを削除(データベース名を変更して退避してから不要になったら削除するのがよいかも)
  5. createdbコマンドで文字コードを変更して再度データベースを作成
  6. psqlコマンドで退避していたデータベースのダンプファイルを読み込む
1. Windows上のPostgreSQLのすべての情報をダンプ

移植元のWindows上のPostgreSQLのデータベースのファイルからユーザー情報まですべてをコピー元からダンプします。

$ pg_dumpall --username=postgres -f [ファイル名]
2. ダンプしたファイルをUbuntu上にリストア

移植先のUbuntu上のダンプしたファイルをコピーし、PostgreSQLにリストアします。(PostgreSQLは既にインストールした状態で実施してください)

$ pg_restore -v --host=localhost --username=postgres  --dbname=[DB名] [ファイル名]

ここで念のためデータベースのリストを確認しておきます。

$ psql -l
                               List of databases
     Name      |  Owner   | Encoding  | Collate | Ctype |   Access privileges
---------------+----------+-----------+---------+-------+-----------------------
 postgres      | postgres | SQL_ASCII | C       | C     |
 template0     | postgres | SQL_ASCII | C       | C     | =c/postgres          +
               |          |           |         |       | postgres=CTc/postgres
 template1     | postgres | SQL_ASCII | C       | C     | =c/postgres          +
               |          |           |         |       | postgres=CTc/postgres
 testdb        | hassiweb | SQL_ASCII | C       | C     |
3. 文字コードを変更したいデータベースを一時退避

文字コードを変更したいデータベースのみをダンプして一時退避します。

$ pg_dump [データベース名] > [任意のファイル名]
4. 対象のデータベースを削除

文字コードを変更したいデータベースを一度削除します。(同じデータベース名で文字コードを変更したい場合のみ削除、もしくはデータベース名を変更するなどして不要なタイミングで削除すればよいです)

$ dropdb [データベース名]
5. 文字コードを変更して再度データベースを作成

文字コードをUTF8としてデータベースを作成しますが、通常データベースを作成する際はtemplate1という空のデータベースをコピーして新しいデータベースを作るのだが、このデータベースがUTF8以外の文字コードで作成されたいた場合、エラーとなります。その際は、template0を使用してデータベースを作成すると解決できます。なお、データベースの作成はデータベースを作成する権限があるスーパーユーザーでしかできないため、そのユーザーにスイッチしておくか、そのユーザーとして作成する必要があります。

$ createdb [データベース名] -U [リモート接続可能なスーパーユーザーもしくはローカルのスーパーユーザー] -O [オーナーユーザー名] -E UTF8 -T template0

データベースを確認するとEncodingがUTF8になっているはずです。

$ psql -l
                               List of databases
     Name      |  Owner   | Encoding  | Collate | Ctype |   Access privileges
---------------+----------+-----------+---------+-------+-----------------------
 postgres      | postgres | SQL_ASCII | C       | C     |
 template0     | postgres | SQL_ASCII | C       | C     | =c/postgres          +
               |          |           |         |       | postgres=CTc/postgres
 template1     | postgres | SQL_ASCII | C       | C     | =c/postgres          +
               |          |           |         |       | postgres=CTc/postgres
 testdb        | hassiweb | UTF8      | C       | C     |
6. 退避していたデータベースのダンプファイルを読み込む

3.でダンプしておいたファイルを読み込みます。実行後にresult.logファイルに特にエラーなど出ていなければ成功です。

$ psql -U [データベースのオーナーユーザー名] -d [データベース名] -f [ダンプしておいたデータベースファイル] > result.log 2>&1
参考

本記事を作成するにあたって下記のページを参考にさせていただきました。


今回は以上です。 最後まで読んでいただき、ありがとうございます。


ブログランキング・にほんブログ村へ  ← 気に入っていただければ応援ポチをお願いします!

コメント

このブログの人気の投稿

LinuxでのnVidia GPUのオーバークロック・電力チューニング方法