さくらのレンタルサーバで MySQL 4.0 から 5.1 へ移行した記録
提供: MoreslowlyWiki
さくらのレンタルサーバ スタンダード で MySQL 5.1 が使えるようになったので、今まで使っていた MySQL 4.0 から移行したときの記録。
注意:以下と同じようにやっても失敗する可能性があります。データベースの削除などするので、完全にデータが失われたりするかもしれません。
関連ページ
Hgwr 2009年5月6日 (水) 02:04 (UTC)
目次 |
移行作業中に表示されるメンテナンス画面の設定
MySQL を使っているのは、 bm と MediaWiki 1.13.5 で動いている MoreslowlyWiki だった。どちらも PHP で書かれている。
移行作業中に自分ち以外の IP アドレスからそれらのページにアクセスすると、メンテナンス中であることを知らせるページにリダイレクトするようにした。
/.htaccess に次のような mod_rewrite の設定を書いた。
(参考 【IT-rescue】メンテナンスページをmod_rewriteで出す)
RewriteEngine On
RewriteCond %{REMOTE_ADDR} 自分ちのIPアドレス
RewriteRule .* - [L]
RewriteRule /index.html$ - [L]
RewriteRule bm/.*$ /index.html [R=302,L]
RewriteRule mw/.*$ /index.html [R=302,L]
メンテナンス画面を新たに作成するのがめんどくさかったので、トップページ (/index.html) にメンテナンス中であることを知らせるメッセージを追加した。
RewriteRule のところの正規表現で
RewriteRule ^/bm/.*$ /index.html [R=302,L]
とやっても良さそうなものだけど、これではうまくいかなかった。
データベースのバックアップ
参考にしたページ
ssh でサーバにログインし、 DB のバックアップをとる。
$ mysqldump -l --opt --host=DBSERVER --user=USER --password=PASS --default-character-set=latin1 DBNAME > db.dump
現在のデータベース (MySQL 4.0) の文字コードの設定の確認
シェルから mysql を立ち上げて、 status コマンドで、文字コードの設定などを確認した。
Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 38851469 Server version: 4.0.27 Type 'help;' or '\h' for help. Type '\c' to clear the buffer. mysql> status; -------------- mysql Ver 14.14 Distrib 5.1.30, for portbld-freebsd7.1 (i386) using 5.2 Connection id: 38851469 Current database: USER Current user: USER@HOST SSL: Not in use Current pager: /usr/bin/less Using outfile: '' Using delimiter: ; Server version: 4.0.27 Protocol version: 10 Connection: DBSERVER via TCP/IP Client characterset: ujis Server characterset: ujis TCP port: 3306 Uptime: 78 days 17 hours 41 min 26 sec
上から見て取れること
- クライアントの mysql は 5.1.30 で、サーバ側は 4.0.27
- クライアント側もサーバ側も文字コードは ujis になっていた。
でも、設定では ujis になっているけれど、実際は utf-8 を使っていたはず。
というのも、 create table ( ... ) ) character set utf8 ; としていたから。
mysqldump するときに --default-character-set=latin1 をつけたので、文字コードの変換なしに utf-8 のままダンプされたはず。
データベースの削除と作成
さくらインターネットのスタンダードプランでは、MySQL 4.0 と MySQL 5.1 を同時に使わせてはくれないので、 4.0 のバックアップを取ったあとに、「サーバコントロールパネル」の「データベースの設定」から 「データベースを削除」する必要があった。
削除したあとに、 MySQL 5.1 のデータベースを「サーバコントロールパネル」の「データベースの設定」から作成した。
新しいデータベース (MySQL 5.1) の文字コードの設定の確認と設定
シェルから mysql コマンドで新しいデータベースに接続し、 status コマンドで文字コードの設定などを確認した。
Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 1335803 Server version: 5.1.34 FreeBSD port: mysql-server-5.1.34 Type 'help;' or '\h' for help. Type '\c' to clear the buffer. mysql> status -------------- mysql Ver 14.14 Distrib 5.1.30, for portbld-freebsd7.1 (i386) using 5.2 Connection id: 1335803 Current database: USER Current user: USER@HOST SSL: Not in use Current pager: /usr/bin/less Using outfile: '' Using delimiter: ; Server version: 5.1.34 FreeBSD port: mysql-server-5.1.34 Protocol version: 10 Connection: DBSERVER via TCP/IP Server characterset: ujis Db characterset: ujis Client characterset: ujis Conn. characterset: ujis TCP port: 3306 Uptime: 8 days 14 hours 50 min 10 sec
データベースの文字コードが ujis になっていたので、次のようにして修正した。
mysql> alter database DB_NAME character set utf8;
ダンプファイルの修正
mysqldump が吐き出した SQL のダンプファイルを MySQL 5.1 に流し込むためには、そのダンプファイルを少し編集する必要があった。
そうしないと、マルチバイト文字が全く無視された状態 (たぶん空文字あつかい) でデータが登録されてしまうらしく、以下のようにキーの重複のエラーがでた。
$ mysql -l --opt --host=DBSERVER --user=USER --password=PASS DBNAME < db.dump ERROR 1062 (23000) at line 72: Duplicate entry ...... for key 'PRIMARY'
MySQL4.1/9.MySQLの実験/3.漢字の使用 - Ground-SunLight にある通り、 MySQL の文字コードの設定には client, connection, results などいろいろな項目があるみたい。
mysql> show variables like 'character_set%'; +--------------------------+----------------------------------+ | Variable_name | Value | +--------------------------+----------------------------------+ | character_set_client | ujis | | character_set_connection | ujis | | character_set_database | utf8 | | character_set_filesystem | binary | | character_set_results | ujis | | character_set_server | ujis | | character_set_system | utf8 | | character_sets_dir | /usr/local/share/mysql/charsets/ | +--------------------------+----------------------------------+ 8 rows in set (0.00 sec)
データベースの文字コードはさきほど alter database DB_NAME character set utf8; したので utf-8 に直っている。
bm も MoreslowlyWiki (MediaWiki) も、全部 utf-8 で動いているので DB 側も utf-8 で動かすようにしたかった。
ダンプファイルの内容は、だいたい次のようなのの繰り返しになっていた。
SET @saved_cs_client = @@character_set_client; SET character_set_client = utf8; CREATE TABLE `...` ( ... ) TYPE=MyISAM; SET character_set_client = @saved_cs_client; .... LOCK TABLES `...` WRITE; INSERT INTO `...` VALUES (.... 長い長いデータ列 ...
上から見てとれること
- CREATE TABLE の前でデフォルトの character_set_client を保存し、 utf8 に一時的に切り替えて CREATE TABLE している
- データを INSERT するときはデフォルトの character_set_client でしている。
なので、ダンプファイルを次のように修正した。
まず sed を使って、デフォルトの character_set_client を保存したり復帰させたりしている行を全て削除した。
$ sed -e '/^SET .*@saved_cs_/d' db.dump > db.dump.new
次にダンプファイルの先頭に、次のような行を追加した。
SET character_set_client = utf8; SET character_set_connection = utf8; SET character_set_results = utf8;
これで client, connection, database ともに utf-8 になったので、 utf-8 なダンプファイルがなんの変換もなしに DB につっこまれるはず、たぶん。 character_set_results の設定はいらなかったかも。
このようなダンプファイルの修正をしてリストアしたら、何もエラーが出ずにすんなり入った。
$ mysql -l --opt --host=DBSERVER --user=USER --password=PASS DBNAME < db.dump.new
ウェブアプリの設定
データベースサーバのホスト名が変ったので、その修正をした。
独自ウェブアプリの bm のほうでは、 mysql_connect()
したあとに、 mysql_set_charset("utf8") が必要になってしまった。
MediaWiki で動いている MoreslowlyWiki のほうは MediaWikiでMySQL4から5に切り替えと、データの移行 (r271-635) を参考に移行の設定をした。
ただし、データベースの移行はすんでいるので、 dumpBackup.php などのツールでバックアップとリストアはしなかった。
具体的には次のようにした。
- LocalSettings.php を backup_LocalSettings.php などと名前をかえる
- MediaWiki をブラウザからアクセスすると、セットアップのページが表示される
- 最初に MediaWiki をインストールしたときみたいに、フォームにいろいろ書きこんで設定する
- うまくいったら、 backup_LocalSettings.php を見ながら独自設定を LocalSettings.php に復帰させる

