MySQLで「ERROR 2013 (HY000): Lost connection to MySQL server during query」のエラーが発生しました。
その時いろいろ試行錯誤してエラーを解消させたメモです。原因は人それぞれなので、その参考になれば幸いです。
発生した経緯
テスト環境用のデータベースを再構築するため、データを本番の環境からコピーしようとmysqldumpで2400万件程度のダンプを取った後、テスト環境にインポートした時にエラーが発生しました。
原因の調査
さまざまさ原因が考えらますが、
- 今回は一つのSQL文が長すぎるから?
- ダンプのデータ量が多すぎてタイムアウトしている?
- max_allowed_packetの設定値より大きいパケットを受け取った場合はPacket too largeエラーで接続がクローズされた?
- ⇒クライアントの中には通信パケットが大きいとLost connection to MySQL server during query エラーが発生する
検証:MySQLの設定を変更してみる
とりあえずMySQLの設定値を変更して、トライ&エラーで検証してみました。
下記クエリでタイムアウトの設定を確認
show variables like '%timeout%';
設定変更方法としてmy.confを修正し再起動する方法と、set globalクエリを上げる2つがある。
※クエリ方法はそのセッション内のみ適応されるので注意。
色々設定を変えて試してみた!!
- 「max_connections=150」にしてみるmax_connectionsとは「MySQLサーバが許可する、MySQLクライアントの同時接続最大数」
⇒ 効果なし - tmp_table_size = 1024M、sort_buffer_size=1024M」にしてみる
⇒ 効果なし - 「max_heap_table_size=1024M、tmp_table_size=2048M、sort_buffer_size=2048M」にしてみる
⇒ 効果なし - 「max_allowed_packet=512M」にしてみる
⇒ 効果なし - 「max_allowed_packet=10124M」にしてみる
⇒ 効果なし - 「read_rnd_buffer_size=1024M」にしてみる
⇒ 効果なし - 「max_allowed_packet=3000M、max_heap_table_size=3000M、tmp_table_size=3000M、sort_buffer_size=3000M、read_rnd_buffer_size=3000M、max_connections=300」にしてみる
⇒ 効果なし - 「max_allowed_packet=512M」に戻して「mysql -u[user] -p [db_name] --max_allowed_packet=10124M < [file]」を実行
⇒ 効果なし
解決
検証しすぎて疲れてきた。(;><)
設定を変えて試してもなかなか解消されないので、別の視点で考えてみたらあっさり解消できました。!
原因はmysqlのデータ保存先のディレクトリの容量が100%だったこと。
結構盲点でAPサーバとDBサーバを別サーバに分けていたため、APサーバの状態しか見てなかった。これは恥ずかしいぃ。(/ω\)
その中でクエリログ(querities.log)が96GBもあったため、削除して再実行したら普通に取り込めた!やったぁ!(*´▽`*)