もろもろの歴史的理由により、レンタルサーバをいくつか契約しているのですが、ふる〜いサーバから新しいサーバの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 にデータを移行することができました。

ブックマーク & Twitter & はてなスター
コメント