株式会社クイックでアプリケーションエンジニアをしているhamanokamiです。
今日は、先日発生して困ったエラーについて書いていきます。
■どんな問題が起こったの?
弊社で運用しているシステムで、毎日特定の時間に実行している
あるジョブが正常終了せずに、次の日のジョブ実行までずっと実行中のままでした。
実行ログを確認したところ、"Error while sending QUERY packet."という
エラーが出力されていました。
■エラー内容について調べてみた
"Error while sending QUERY packet.”というエラーは初めて見たため、
まずは調べてみました。
調べてみると、複数の原因があることが判明しました。
* 参考URL
http://tsugu76.hatenablog.com/entry/2014/04/30/064746
■クソクエリを調査してみた
次にそもそも原因を起こしたクソクエリを何だろうということで、
調べてみました。
調査方法として、クエリログを出力しているため、
ジョブ実行時間帯のログのみを抜き出し、
そのジョブで最後に実行されているクエリを確認しました。
手順としては、
①ジョブ実行時間帯のログを、みんな大好きgrepコマンドで抜き出す
②ジョブのプロセスIDを特定する
③該当プロセスIDで最後に実行されたSQLを確認する
という具合です。
で、見つけましたクソクエリ。
原因になっていたクソクエリを生成しているソースの部分を確認すると、
先日修正したソース箇所で不具合を起こしていました。
※影響範囲だと思っていなかったorz
■解決策
ということで、下記解決策があります。
【根本的な解決】
- クエリの見直し
- データ量のバリデーションを見直す(ファイルアップロード等)
【暫定的な解決】
- 原因がデータ量の場合、max_allowed_packetの設定値を変更
- 原因が接続時間の場合、wait_timeoutの設定値を変更
今回の場合は、条件文生成時の不具合だったため、
プログラムの修正を行い、クエリの見直しを行いました。
■最後に
今回の原因がそもそも意図しないバグで
クソクエリが生まれていたので、
影響範囲は適切に把握して、
テストすることは大事だと感じました。