MySQLでERROR 2006 (HY000) MySQL server has gone awayが出たときの対処

無事解消できたか分からないので間違いがあるかもしれないけれど、表題のエラーが出たときのメモ。状況としては、WikipediaのDumpをインポート中に発生した。日本語版、中国語版、英語版の順番で処理をしていて、英語版でコケたのでデータサイズが原因のように思う。

エラーメッセージ等で調べると「max_allowed_packet」の値を大きくすると良いという情報が出てくる。この値を確認するには以下のコマンドを実行すれば良い。ただし、自環境では同コマンド実行時にエラーが出て値を確認できない状態だったので、原因を調べることにした。

$ mysql> show variables like 'max_allowed_packet';

mysql - Table 'performance_schema.session_variables' doesn't exist - Stack Overflowによると、mysql_upgradeを実行してmysql.serverをrestartすれば良いらしい。記憶が不鮮明だが、以前show variables like ~ で何かの設定値を確認したときは通ったように思うので、MySQLのアップグレード時(brew update/upgrade経由)に何か起きたのかな。

set globalなんちゃらのコマンドを使えば設定ファイルを手動で書き換えなくても設定が反映されるという情報を見かけたが、自環境ではうまくいかなかったので(pathが通っていないとかそういう原因かな)、設定ファイル(my.cnf)を探して書き換えることにした。少し前に変更を行った記憶はあるのだが、どこにあるのか分からなかったので、my.cnfの場所を調べる - Qiitaにあるコマンドを実行した。念のために以下にコピペしておく。

$ mysql --help | grep my.cnf

上記を実行後、「max_allowed_packet」の値変更が反映されたことを確認したのち再挑戦したが、前回よりも少し読み込みが進んだところで再度コケた。めげずにググり直し、それっぽい設定が書かれた内容をほぼそのままコピペし(タイムアウトまでの時間を伸ばしたりした)、ただいま3回目の挑戦中。うまくいくと良いのだが。ダンプファイルから必要な箇所だけ取り出してインポートすることも考えたが、すこし面倒くさそうなので、なるべく避けたい。

見よう見まねでやっているので正しいアプローチかどうか定かでないという根本的な問題があるが、いまのところ、周囲にこの手のことに特化して詳しい人がいない。本当に必要な(=抽出したい)データは全体のなかの一部なので、もっと良い方法があるかもなあとは思う。

## 追記 ##
・外付けディスクにSQLファイルを入れた状態でimportしているのが時間がかかる要因(のひとつ)かもしれない。
import作業を行なっているマシン自体、リモート接続して操作しているのだが、zsh上でpmset noidleなどの指定を行っても外付けのディスクへのアクセスは非操作時には停止しているのかも。本体のストレージを圧迫するのが嫌なので隔離しているのだが、あまり良い戦略とは言えないかもしれない(ただいま進捗50% 3月14日16時時点)
・58時間ほどかかったが、importが完了した。容量次第ではあるが、今度からはローカル領域にデータを置いて作業しようかな(2016年3月15日21時時点)