プロジェクトデータベースサーバの移行について

このドキュメントは2009年に行ったプロジェクトDBサーバ移行時のドキュメントです。現時点では得意必要ない文章ですが、参考までに残されています。 OSDNではプロジェクト Web 等から使用できるデータベースサーバとして、 mysql.sourceforge.jp という MySQL サーバを稼働させています。 このサービスを新しいハードウェアに移行し、 mysql5.sourceforge.jp として稼働することになりました。

新サーバは MySQL 5.0 を利用しており、 旧サーバの 4.0 とは文字コードの扱いなどが大きく異なっています。 よって、SourceForge.JP 側で一括してデータの変換を行うことができません。

そのため、しばらくの間、新旧両サーバを同時に動かしておき、 ユーザの皆様にデータの移行をお願いすることになりました。

移行期間は2009年5月31までの予定です。6月1日以降に旧サーバ(mysql.sourceforge.jp)は停止いたします。

移行期間が過ぎても移行を行っていないプロジェクトのデータの移行は行いませんので、 必要な場合は上記期間内に必ず作業を行ってください。

良く分からない場合や、手間が取れない場合は SourceForege.JP のスタッフに変換を 依頼することも出来ます(この場合は文字コード変換なしでバイナリで入れる事になります)。 その際は チケット まで対象のプロジェクト名を記入してください。

新旧サーバの相違点

旧サーバ新サーバ
ホスト名mysql.sourceforge.jpmysql5.sourceforge.jp
MySQL のバージョン4.0.245.0.51a

移行作業の必要なプロジェクト

以下の移行作業が必要なのは、

プロジェクトでSourceForge.JPが提供しているデータベース機能を利用している場合のみ

です。

プロジェクトでデータベースを利用していない場合、移行作業は必要ありません。

データベースの利用があるかどうかの確認方法

プロジェクトメニューの「管理」から「データベースの管理」を参照してください。

「現在のデータベース」にデータベース名が表示されているプロジェクトはデータベースの 利用がありますので、作業の必要があります。

「このプロジェクトに割り当てられているデータベースはありません。」

のように、表示されているプロジェクトはデータベースの利用がありませんから、 作業の必要はありません(以下、読み飛ばしていただいて構いません)

移行に関するポイント

データの移行を行うにあたって、以下のポイントに注意してください。

各種エンコーディングの設定を適切に行う

MySQL 5.0 では、データベース(テーブル)や接続クライアントなどにエンコーディングを設定し、 必要に応じてコード変換を行います。そのため、これらのエンコーディングの設定が間違っていると、 データが壊れてしまう場合があります

mysql5.sourceforge.jp では、以下のようなエンコーディングに設定しています。 標準で全て文字コードは utf8 に設定され、データベースの文字コードも 初期状態では utf8 で作成されます。

mysql> show global variables like 'character_set\_%';
+--------------------------+--------+
| Variable_name            | Value  |
+--------------------------+--------+
| character_set_client     | utf8   | 
| character_set_connection | utf8   | 
| character_set_database   | utf8   | 
| character_set_filesystem | binary | 
| character_set_results    | utf8   | 
| character_set_server     | utf8   | 
| character_set_system     | utf8   | 
+--------------------------+--------+
7 rows in set (0.00 sec)

データの文字コードに UTF-8 を使い、mysql コマンドのみを使う場合は、とくに設定は必要ありません。 しかし、多くの方が利用している Web アプリなど、 PHP や Perl のライブラリを利用して MySQL にアクセスする場合は、 character_set_client はデフォルトでは latin1 になっています。 そのため、UTF-8 を利用する場合であっても、各種設定およびコードの修正が必要になりますので、注意してください

設定したエンコーディングとデータのエンコーディングを合わせる

各種エンコーディング設定に応じてコード変換を行うため、 データそのもののエンコーディングを、 設定のエンコーディングに合わせておく必要があります。 たとえば、データベースのエンコーディング設定(character_set_database)と、 クライアントのエンコーディング設定(character_set_client)が utf8 になっているのに、 EUC-JP のデータを入れてしまうと、正しいデータが入らなくなってしまいます。

EUC-JP のデータを扱う場合は、 character_set_database と character_set_client をともに ujis に設定しておくと、 全く変換されずにデータのやりとりを行います。 また、character_set_database を utf8 にし、character_set_client を ujis にすると、 EUC-JP でデータのやりとりを行うが、データベースには utf8 に変換して保存することになります。

実際のデータがどのエンコーディングになっており、それと設定が合っているかどうかを必ず確認してください

データの移行手順

過去既にデータベースを使っていた場合、mysql5 側には空のデータベースが出来ています。 以下のような手順で、データを移行してから、アプリケーションの変更を行ってください。

  1. mysql.sourceforge.jp を利用しているアプリケーションを止める(データの更新を止める)
  2. mysql.sourceforge.jp から全データをダンプする
  3. mysql5.sourceforge.jp に全データをリストアする
  4. システムの MySQL サーバ接続先・character_set_client の設定変更
  5. アプリケーションを再開する

具体的な移行例

例として、EUC-JP を利用している(内部的に EUC-JP で処理を行い、EUC-JP で出力している) アプリケーションを移行する方法について、下記のプロジェクト名を利用して解説します。

プロジェクトUNIX名mysql-test
データベース名(プロジェクトUNIX名と同じ)mysql-test
データベースユーザ名(プロジェクトUNIX名と同じ)mysql-test
データベース接続パスワードプロジェクトページで確認

エンコーディングを決める

初めに、移行後にどのエンコーディングを使うか決めてください。 今回の例では以下のように移行します。

  • データベース内では UTF-8 で保存する
  • アプリケーションでは EUC-JP を利用する

MySQL 4.1 から、各種文字列関数や varchar カラムの長さ制限をバイト単位ではなく文字単位で扱ったり、 接続時に自動的に文字エンコーディングを変換する事が可能になっています。

この機能を正しく使うには、 アプリケーション側で MySQL のエンコーディングを設定出来る必要があります。 具体的には接続時に SET NAMES (もしくは charset や set character_set_* など)を発行出来なくてはなりません。

もし、アプリケーション側にそのような機能がなかったり、 アプリケーション側の変更を最低限に留めたい場合は、 MySQL 側でデータベースのエンコーディングを binary に設定することで、 今までのシステムをほとんど変更無しで動かすことができます。 その方法は最後に書きましたので、そちらもご確認ください。

mysql.sourceforge.jp からデータをダンプする

まず、データをダンプします。ダンプする前に、アプリケーションのデータ更新系が止まっていることを確認してください。 ダンプ時にデータベースへの接続パスワードを聞かれますので入力してください。

mysqldump -h mysql.sourceforge.jp -u プロジェクトUNIX名 -p プロジェクトUNIX名 > dump.sql

mysql-test プロジェクトの場合、以下のようになります。

mysqldump -h mysql.sourceforge.jp -u mysql-test -p mysql-test > dump.sql

これで dump.sql の中にプロジェクトDBの全データがダンプされます。

mysql5.sourceforge.jp に書き戻す

次に、適切なエンコーディングオプションを付けて mysql5.sourceforge.jp に書き戻します。 使うコマンドは以下の通りです。

mysql -h mysql5.sourceforge.jp -u プロジェクトUNIX名 -p プロジェクトUNIX名 --default-character-set=エンコーディング名 < dump.sql

ここで指定する エンコーディング名 は、mysql.sourceforge.jp に入っていたデータのエンコード名を指定してください。 EUC-JP の場合は "ujis", Shift_JIS の場合は "cp932" を使います。

mysql-test プロジェクトの場合、いままで EUC-JP を利用していましたので、ujis を指定します。

mysql -h mysql5.sourceforge.jp -u mysql-test -p mysql-test --default-character-set=ujis < dump.sql

これにより、データは新データベースサーバに UTF-8 で格納されます

もし、エンコードの指定を間違えた場合は、単純に指定を変更してもう一度リストアしてください。

アプリケーションの設定を変更する

データが問題なく入っているかどうか確認出来たら、アプリケーションの接続先ホスト名を ”mysql5.sourceforge.jp” に切り替えてください。

また、接続のエンコーディングを正しく指定してください。 具体的な設定方法はアプリケーション毎に異なるため解説できません。 アプリケーションの設定でできる場合もありますし、ライブラリの設定を行う場合もあります。 接続直後に "SET NAMES utf8" や "CHARSET utf8" と言ったクエリを自動実行するなど、 様々な方法で可能です。コードの変更が必要な場合は、ここで変更してください。

mysql-test プロジェクトの場合は EUC-JP を利用しますので、 たとえば、接続直後に "SET NAMES ujis" を実行するようにします。

最後に、アプリケーションを再開し、動作確認を行ってください。 問題が起きなければこれで完了です。

現在の構成をできるだけの変更せず、文字コードも変換しない場合

現在動いているシステムを極力変更なしで移動したい場合は、 MySQL 側でデータベースのエンコーディングを "binary" に設定します。 これによりクライアント側のエンコーディングが何であっても、 エンコード変換無しで結果を受け取ることが出来ます。

ただしこの場合、色々な動作がバイト単位になる点に注意してください。 例えば varchar カラムの文字数制限や、like のマッチの挙動 などがマルチバイト文字の途中に適用される可能性があり、 結果としてデータが破壊される場合があります

具体的な手順は以下の通りです。

データベースのエンコーディングを変更する

まず、ALTER DATABASE を使ってデータベースのエンコーディングを binary に変更します。 以下のようにします。

$ mysql -h mysql5.sourceforge.jp -u プロジェクトUNIX名 -p プロジェクトUNIX名
Enter password: (データベース接続パスワードを入力)
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 14263
Server version: 5.0.51a-24-log (Debian)

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> ALTER DATABASE `プロジェクトUNIX名` CHARACTER SET binary;
Query OK, 1 row affected (0.00 sec)

mysql> quit
Bye

データをダンプしてから書き戻す

mysql.sourceforge.jp からデータをダンプし、--default-character-set=binary のオプションを付けて mysql5.sourceforge.jp に書き戻します。 使うコマンドは以下の通りです。 データベース接続パスワードを聞かれますので入力してください。

ダンプ

mysqldump -h mysql.sourceforge.jp -u プロジェクトUNIX名 -p プロジェクトUNIX名 > dump.sql

書き戻し

mysql -h mysql5.sourceforge.jp -u プロジェクトUNIX名 -p プロジェクトUNIX名 --default-character-set=binary < dump.sql

エラー無く終了すれば、新サーバ側にデータがコピーされています。 アプリケーションの接続先を mysql5.sourceforge.jp に切り替えてください。