プロジェクトデータベースサーバの移行についてSourceForge.JP ではプロジェクト 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 のスタッフに変換を 依頼することも出来ます(この場合は文字コード変換なしでバイナリで入れる事になります)。 その際は チケット まで対象のプロジェクト名を記入してください。 新旧サーバの相違点
移行作業の必要なプロジェクト以下の移行作業が必要なのは、 プロジェクトで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 側には空のデータベースが出来ています。 以下のような手順で、データを移行してから、アプリケーションの変更を行ってください。
具体的な移行例例として、EUC-JP を利用している(内部的に EUC-JP で処理を行い、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 に切り替えてください。 |