読者です 読者をやめる 読者になる 読者になる

株式会社クイックのWebサービス開発blog

HAPPYなエンジニア&デザイナーのブログです

"Error while sending QUERY packet."ってエラーの対処方法

障害対応 Oracle

株式会社クイックでアプリケーションエンジニアをしているhamanokamiです。

今日は、先日発生して困ったエラーについて書いていきます。


■どんな問題が起こったの?

弊社で運用しているシステムで、毎日特定の時間に実行している
あるジョブが正常終了せずに、次の日のジョブ実行までずっと実行中のままでした。

実行ログを確認したところ、"Error while sending QUERY packet."という
エラーが出力されていました。

 

■エラー内容について調べてみた

"Error while sending QUERY packet.”というエラーは初めて見たため、
まずは調べてみました。

調べてみると、複数の原因があることが判明しました。

  • MySQLに送るデータ量が設定より大きすぎる(max_allowed_packet)
  • MySQL接続時間が設定内で収まらなかった(wait_timeout)

 * 参考URL

http://tsugu76.hatenablog.com/entry/2014/04/30/064746


■クソクエリを調査してみた

次にそもそも原因を起こしたクソクエリを何だろうということで、
調べてみました。

調査方法として、クエリログを出力しているため、
ジョブ実行時間帯のログのみを抜き出し、
そのジョブで最後に実行されているクエリを確認しました。

手順としては、
①ジョブ実行時間帯のログを、みんな大好きgrepコマンドで抜き出す
②ジョブのプロセスIDを特定する
③該当プロセスIDで最後に実行されたSQLを確認する
という具合です。

で、見つけましたクソクエリ。

原因になっていたクソクエリを生成しているソースの部分を確認すると、
先日修正したソース箇所で不具合を起こしていました。
※影響範囲だと思っていなかったorz


■解決策

ということで、下記解決策があります。

【根本的な解決】

  • クエリの見直し
  • データ量のバリデーションを見直す(ファイルアップロード等)

 【暫定的な解決】

  • 原因がデータ量の場合、max_allowed_packetの設定値を変更
  • 原因が接続時間の場合、wait_timeoutの設定値を変更

 

今回の場合は、条件文生成時の不具合だったため、
プログラムの修正を行い、クエリの見直しを行いました。

 

■最後に

今回の原因がそもそも意図しないバグで
クソクエリが生まれていたので、
影響範囲は適切に把握して、
テストすることは大事だと感じました。