さくらのmysqlで大きなファイルをインポートしたら後半のデータが文字化けした(–default-character-set=utf8で解決)

この記事について

環境さくらレンタルサーバー、mysql
目的プラン変更に伴い、旧DBサーバーから新DBサーバーへsqlファイルでデータを移行する
結果ログイン時に–default-character-set=utf8を指定してからsourceでインポートしたら文字化けしなかった

つまずきポイント要約

  • ERROR 2006 (MySQL server has gone away)で再接続された後から文字化けしていた
  • max_allowed_packetを上げれば解決できるらしいが、さくらの共用プランではmy.cnfをいじれない
  • 接続時の文字コードがujisになっていたのが原因くさい

事象

サクラインターネットのレンタルサーバーをプラン変更したとき、古いデータベースサーバーから新しいデータベースサーバーにデータを移行する必要があった。古いデータを mysqladmin から sql ファイルとしてエクスポートして、新しいデータベースサーバーへはターミナルで接続して source コマンドでインポートした。

すると、いくつかあるテーブルの内、後半のテーブル内のデータが文字化けする現象に遭遇した。インポート中のターミナル画面を見ていると気になるエラー?を発見。

Query OK, 870 rows affected (0.02 sec)
Records: 870  Duplicates: 0  Warnings: 0

ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...

Query OK, 850 rows affected (0.02 sec)
Records: 850  Duplicates: 0  Warnings: 0

いったんデータベースサーバーへの接続が切断されて、その後再接続が行われている。そして、その再接続後から文字化けが起こっている?

原因

このエラーは、インポートするデータが大きすぎると起こるらしい。

対処

自分でいじれるサーバーであれば、max_allowed_packet の値を上げることで解決できるようだが(参考)、さくらの自分のプランでは、my.cnf をいじることができないため通用せず。

mysql の文字コードを確認してみる。

//コマンド

mysql> show variables like "chara%";
+--------------------------+----------------------------------+
| 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/ |
+--------------------------+----------------------------------+

utf8 のデータだが、設定されている文字コードは ujis が多い。文字コードを変更する最も一般的な方法は my.cnf を書き換えることだが自分のプランではできない。ターミナルで mysqlサーバーへログインするときに 文字コードを指定してみる。

//ターミナルで文字コードを設定

mysql -u ユーザー名 -p -h ホスト名 --default-character-set=utf8

//設定後

+--------------------------+----------------------------------+
| Variable_name            | Value                            |
+--------------------------+----------------------------------+
| character_set_client     | utf8                             |
| character_set_connection | utf8                             |
| character_set_database   | ujis                             |
| character_set_filesystem | binary                           |
| character_set_results    | utf8                             |
| character_set_server     | ujis                             |
| character_set_system     | utf8                             |
| character_sets_dir       | /usr/local/share/mysql/charsets/ |
+--------------------------+----------------------------------+

character_set_database は use でデータベースを選択すると、データベースの文字コードになる。

//最終的にこうなった

+--------------------------+----------------------------------+
| Variable_name            | Value                            |
+--------------------------+----------------------------------+
| character_set_client     | utf8                             |
| character_set_connection | utf8                             |
| character_set_database   | ujis                             |
| character_set_filesystem | binary                           |
| character_set_results    | utf8                             |
| character_set_server     | ujis                             |
| character_set_system     | utf8                             |
| character_sets_dir       | /usr/local/share/mysql/charsets/ |
+--------------------------+----------------------------------+

この状態で sql ファイルを source で実行したら文字化けは起こらなかった。

関連記事

タイトルとURLをコピーしました