さくらのレンタルサーバで MySQL 4.0 から 5.1 へ移行した記録

提供: MoreslowlyWiki

さくらのレンタルサーバ スタンダード で MySQL 5.1 が使えるようになったので、今まで使っていた MySQL 4.0 から移行したときの記録。

注意:以下と同じようにやっても失敗する可能性があります。データベースの削除などするので、完全にデータが失われたりするかもしれません。

関連ページ

Hgwr 2009年5月6日 (水) 02:04 (UTC)

目次

移行作業中に表示されるメンテナンス画面の設定

MySQL を使っているのは、 bmMediaWiki 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 に復帰させる
個人用ツール