はじめに
業務にてORA-03135エラーに苦しめられたため備忘として記載します。
ORA-03135
OracleDBとの接続中にOracleDBサーバが何かしらの理由で停止した時や、接続タイムアウトが起きたときに発生
YYYY/MM/DD HH:mm:ss, pid=XXXXX,XXXXXXX,ERROR,Error - ORA-03135: 接続が失われました
プロセスID: XX
セッションID:XXX、シリアル番号:XXX
一般的な発生原因
直接原因はクライアントサーバとDBサーバの接続が切断されたこと。
根本原因はOS・NW・アプリなど多岐にわたる。
1 パフォーマンスの問題
一次的なネットワークの負荷の上昇、マシンリソースの不足などの場合
2 外部要因による切断
クライアントからの接続がアイドル状態で、外部要因(NW機器・OSなど)により、接続が切断された場合
3 sqlnet.oraのタイムアウト設定
クライアントがDBへの接続時、sqlnet.oraで設定されたタイムアウトの時間内に、認証処理が完了しなかった場合
4 Oracleの異常な動作
DB側での何かしらのエラーが起きて強制切断された場合
対応内容
再現性の確認
クライアントサーバのアプリケーションログと突合し、どの処理が実行されたときにエラーが発生するか確認。
結果としては処理内容に関わらず5~10分程度アイドル状態が続いた後にDBへのアクセスがあると発生することが判明。再現性はあると判断。
しかしこの段階ではどこで接続が切れているかは不明
パケットキャプチャ取得
どこで接続が切れているか確認するため、DBサーバ・クライアントサーバにパケットキャプチャを仕掛けて再現試験を実施し、パケットを解析。
DBサーバのパケットを見るとクライアントサーバがRSTパケットを送信している。
一方でクライアントサーバのパケットを見ると逆にDBサーバ側からRSTを送信しているという不自然な状態。
上記から間にいるNW機器が怪しいと判断。
原因特定
NWの担当者に連携し調査してもらったところCiscoのLBがIdle Timeoutという設定を持っていたことが原因と判明。
このパラメータは指定したセッションのアイドル状態が指定した秒数続いた場合、強制的に両方のサーバにRSTパケットを送ってセッションを切ってしまうとのこと(送信元を対向のIPアドレスに偽装するおまけ付き)
原因がわかったため、NW機器のタイムアウト設定と、DBサーバやクライアントサーバのタイムアウト設定を調整し解決。
最後に
数多くある発生パターンの一つにすぎませんが、本記事がどなたかのお役に立てば幸いです。
ご覧いただきありがとうございました。