= プロジェクトデータベースサーバの移行について
'''このドキュメントは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 に切り替えてください。