mysqlの設定メモ(データベース移行)

ちょっとハマったので調べたこととやったことをメモ。

やろうとしたことは、昔作ったredmineのサーバから、新しく立てたサーバに移行する事だったのだが、
適当にやってmysqlのダンプを新しい方でリストアすると文字化けしまくった。
というわけでグーグル先生に聞いたことから、解決までのメモ。


aptで適当にmysqlを入れる。etchだと5.0系が入る。

設定ファイルは /etc/mysql/my.cnf に出来るので、これを開いて以下のディレクティブ内容を追加。
(関係無い所は省いているので注意)
基本的にはデフォルトの文字コードをUTF8に統一している。

[client]
default-character-set=utf8

[mysqld]
default-character-set=utf8
character-set-server=utf8
#init-connect=SET NAMES utf8  #これを有効にするとコマンドラインから設定出来なくなるので使わない
skip-character-set-client-handshake

[mysqldump]
quick
quote-names
max_allowed_packet      = 16M
default-character-set = utf8
skip-opt

[mysql]
#no-auto-rehash # faster start of mysql but no tab completition
default-character-set=utf8

文字コードの扱いに関してはここが非常に詳しい。

http://www.mysql.gr.jp/frame/modules/bwiki/?FAQ#content_1_40

移行の際に気をつけることは

  • 一般配布のバイナリのデフォルトはlatin1(ISO 8859-1)だが、これは本来は日本語は通らない。
  • 4.0以前だと文字コードを勝手に変換することがあんまりないので、マルチバイト文字もそのまま格納されて使えていた
  • 4.1以降は文字コードをUTF8に勝手に変換するので、日本語のコードをlatin1->UTF8に変換しようとして訳のわからない事になる
  • データベース内にはアプリケーションの文字コード設定のままで格納されているので、mysqldumpでそのまま取り出して適切な文字コードで新しいデータベースにリストアすればよい
  • ただし、4.1以降のmysqldumpはデフォルトでUTF8に勝手に変換する事に注意(mysqlのデフォルト文字コードは設定されていても無視される)

具体的にやったことは以下の通り。

元# mysqldump -a --opt -u USER -pPASS --default-character-set=latin1 redmine > redmine.latin1.mysql
元# sed -e s/latin1/utf8/ redmine.latin1.mysql > redmine.latin1.utf8.mysql
先# mysql -u USER --default-character-set=utf8 redmine < redmine.latin1.utf8.mysql

なお、設定は以下の様になっている。

元サーバ(debian sarge / MySQL version 4.1.11)
設定せずにそのまま使ったので全部latin1になっている。

mysql> SHOW VARIABLES LIKE 'char%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | latin1                     |
| character_set_connection | latin1                     |
| character_set_database   | latin1                     |
| character_set_results    | latin1                     |
| character_set_server     | latin1                     |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
7 rows in set (0.03 sec)

先サーバ(debian etch / MySQL version 5.0.32)
こっちは上で設定をやったサーバなので、全部UTF8になっている。

mysql> SHOW VARIABLES LIKE 'char%';
+--------------------------+----------------------------+
| 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                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

よくみたら元サーバは4.1だった。まぁ出来たからいいか。