Show page source of MySQL5Transition #106556

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

'''このドキュメントは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 のスタッフに変換を
依頼することも出来ます(この場合は文字コード変換なしでバイナリで入れる事になります)。
その際は [/ticket/newticket.php?group_id=1 チケット] まで対象のプロジェクト名を記入してください。

==== 新旧サーバの相違点 ====
||||旧サーバ||新サーバ||
||ホスト名||mysql.sourceforge.jp||'''mysql5.sourceforge.jp'''||
||MySQL のバージョン||4.0.24||'''5.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 に切り替えてください。