MySQL 4.1 から 5.0に、文字化けせずにmysqldumpでデータを移行する

もろもろの歴史的理由により、レンタルサーバをいくつか契約しているのですが、ふる〜いサーバから新しいサーバのMySQLに、データを引っ越した際の作業ログ。MySQL 4.1 から 5.0 へ、mysqldumpでデータ移行する際に、latin1環境からUTF-8環境への文字コード変更という件です。新サーバといっても構築したのは2007年なのですが、MySQLインストールのログはこちら。5.1化は近い将来にまた。

MySQL , DBD:mysql と PHP をバージョンアップ:Goodpic

それでは早速データ移行開始。まず、旧サーバと新サーバのMySQL動作環境を確認。以下のコマンドを各サーバで実行すると、

$ mysql --user=DBユーザ名 --password
mysql> STATUS

結果はそれぞれ以下のようになりました。

旧サーバ
Server version:         4.1.22-standard
Protocol version:       10
Connection:             Localhost via UNIX socket
Server characterset:    latin1
Db     characterset:    latin1
Client characterset:    latin1
Conn.  characterset:    latin1

新サーバ
Server version:         5.0.45-log Source distribution
Protocol version:       10
Connection:             Localhost via UNIX socket
Server characterset:    utf8
Db     characterset:    utf8
Client characterset:    utf8
Conn.  characterset:    utf8

そのまま旧サーバから、mysqldump すると文字化けする展開ですね(参照 hori-uchi.com: mysqldumpで文字化けしないためのメモ)。ですので、character-set を指定して、mysqldump を実行します。

$ mysqldump -a  --user=DBユーザ名 --password --default-character-set=latin1 バックアップするDB名 > backup20090107.mysql 

処理が終了すと、backup20090107.mysql というファイルが作成されます。このファイルを、旧サーバから新サーバにFTPなどで転送します。 念のため、ダンプファイルの中身が文字化けなどをしていないかどうか、確認してみる。

 $ more backup20090107.mysql

SQLのコマンドが沢山書かれていますが、中の日本語が読めれば大丈夫。ただし上記参照サイトに書かれている通り、そのままこのダンプファイルを新サーバ(MySQL 5.0)で読み込むと文字化けしてしまう。上記サイトを参考に前処理をおこなう。(追記 : ファイル内ののSQL文字コード指定の文字列を置換しますが、実際のデータ内にlaten1の文字が無いかは、事前にemacsとかで検索して調べておくと安心ですね。)

新サーバで以下実行
$ perl -pi -e 's/latin1/utf8/' backup20090107.mysql 

同様に、新サーバのMySQLで移行先のデータベースと、ユーザをつくっておく。

$ mysql --user=root --password

mysql> create database データベース名;
mysql> GRANT ALL PRIVILEGES ON データベース名.* TO 'DBユーザ名'@'localhost' IDENTIFIED BY 'パスワード' WITH GRANT OPTION;
mysql> show databases;
mysql> exit

ダンプファイルから、新サーバのMySQLにデータを復元(リストア)することで、データを移行します。

$ mysql --user=DBユーザ名 --password データベース名 < backup20090107.mysql 

これで文字化けすること無く、MySQL 4.1 から MySQL 5.0 にデータを移行することができました。