MySQLデータベースのバックアップとリストア方法のメモ。
端末の文字コードと、サーバの文字コードが違う場合、自動変換が勝手に掛かる。特に端末またはサーバのどちらかがlatin1文字コードの場合、7ビットに切り捨てられるため、データが破壊されてしまう。
文字コード設定の表示を行い、サーバ毎に違うと思われるこれらの設定を確認してから作業すること。
mysql> show variables like 'char%'; +--------------------------+----------------------------------+ | Variable_name | Value | +--------------------------+----------------------------------+ | character_set_client | ujis | | character_set_connection | ujis | | character_set_database | ujis | | 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.01 sec)
バックアップ時に --default-character-set=binary スイッチを付けて、文字コード自動変換を阻止すれば、問題が解決する場合が多い。
普通にバックアップ
mysqldump -Q --host=サーバ --user=ユーザ --password=パスワード / --default-character-set=binary DB名 > backup.sql
16進数を文字に変換してバックアップ(この方法を推奨)
mysqldump -Q --host=サーバ --user=ユーザ --password=パスワード / --default-character-set=binary --hex-blob DB名 > backup.sql
XML形式でバックアップ
mysqldump -Q --host=サーバ --user=ユーザ --password=パスワード / --default-character-set=binary --xml DB名 > backup.xml
リストア
mysql -h サーバ -u ユーザ -pパスワード DB名 < backup.sql
XML形式バックアップファイルのリストア方法は、不明。