Lost connection to MySQL server during query
MySQL でクエリを発行した際に、Lost connection to MySQL server during query
というエラーメッセージが出ることがあります。これは事実を表しただけのメッセージであり、どうすればエラーが出なくなるのかがわかりづらいために困ります。
おそらくアンチパターンに近い解決法
いろいろ調べたところ、MySQL のタイムアウトの値に問題がありそうということが分かりました。そこでまずは現在の設定を見てみます。
mysql > SHOW VARIABLES LIKE '%timeout%';
+-----------------------------+----------+
| Variable_name | Value |
+-----------------------------+----------+
| connect_timeout | 10 |
| delayed_insert_timeout | 300 |
| have_statement_timeout | YES |
| innodb_flush_log_at_timeout | 1 |
| innodb_lock_wait_timeout | 50 |
| innodb_rollback_on_timeout | OFF |
| interactive_timeout | 28800 |
| lock_wait_timeout | 31536000 |
| net_read_timeout | 30 |
| net_write_timeout | 60 |
| rpl_stop_slave_timeout | 31536000 |
| slave_net_timeout | 60 |
| wait_timeout | 28800 |
+-----------------------------+----------+
ここで、connect_timeout
とnet_read_timeout
とnet_write_timeout
を変更してみます。Ubuntu 16.04 LTS では、/etc/mysql/mysql.conf.d/mysqld.cnf
に以下のように追記します。
connect_timeout=3600
net_read_timeout=3600
net_write_timeout=3600
追記したら MySQL を再起動します。そして再びSHOW VARIABLES LIKE '%timeout%';
を実行して値が変更されていることを確認します。
エラーが出なくなった……が
上記設定にすることで確かにエラーは出なくなりました。しかし本質を十分に理解していないために、以下のような問題点があり、この方法はアンチパターンに近いと考えています。
- タイムアウト値を増やしたことによるデメリットはないのか?
- ヤバいクエリを投げた場合でもこの時間を経過しないと消えないとか
- そもそもなぜタイムアウト(と思われるもの)が起こっているのか?
- ネット越しの環境だけで起こっているようならばルータの設定などが原因ではないか?
- 事実ローカル内ではこのエラーは見たことがない
今後も注視していきたいと思います。