ORA-03135エラー
タイトルエラーが起ったときの話です。本エラーはサーバ/クライアント間のOracle接続が
何らかによって切断された時に起こりますよね。
接続してから本エラーが出る、つまりセッションが切断されるまでの時間はちょうど300秒でした。
となるとなんかネットワーク機器が怪しいですよね。
今回の環境ではサーバ/クライアントの間にロードバランサー、ファイアウォールがあります。
それぞれの無通信タイムアウト時間は300秒と3600秒です。
そうです、ロードバランサーが切断していたのです。
ただロードバランサーが悪いというわけではなくこの無通信タイムアウト値は私は
妥当だと思います。
何時間も無通信状態をさせることの方が危険ですよね。
しかし、アプリケーション開発者たちは接続を維持するように設計しておらず
この無通信状態はマストと言うのです。
この場合、無通信状態を維持する方法は以下の2通りあると考えました。
1.ロードバランサーの無通信タイムアウト値を延長する。
2.Oracleサーバ側でプローブ(探針)・パケット送信を一定間隔で行い、
サーバ/クライアント間通信のアクティブを維持する。
今回は諸事情により、上記2を適用し、対応しました。
一つ注意があって、上記2の方法は微量ながらサーバ/クライアント間のトラフィックが
増大します。
ただ、全クライアントでプローブ・パケットを送信するのではなくサーバ側から送信するので
トラフィック増量は微量と判断できます。
つまり、全Oracleセッションに対してではなく、Oracleリスナーポートに対してですので、TCP
レベルで抑えられているということになります。
それでは、その方法を以下に示します。
サーバ側のsqlnet.oraにパラメータを与えて対処します。
このファイルはOracle Netを制御するパラメータを記述するファイルで
デフォルトで$ORACLE_HOME//network/admin以下にあります。
・SQLNET.EXPIRE_TIME
このパラメータはサーバ/クライアント間でのプローブ・パケットの送信間隔(分)です。
デフォルトは0です。つまり、送信しません。
・SQLNET.INBOUND_CONNECT_TIMEOUT
このパラメータはサーバがクライアント接続の際にクライアント認証を行うのですが、
その認証を行う間の制限時間(秒)です。
デフォルトは60秒ですので60秒の間にサーバが接続してきたクライアントを認証できなければ
サーバ側からそのセッションを切断します。
念のため0を指定しました。ただ0だとサーバ/クライアント間は認証無しに無制限に開放されます。
これは悪意のあるクライアントからDoS攻撃をされる場合があります。
今回DBサーバは閉じられたLAN内に位置するため安全と判断しました。
上記設定の後はOracleリスナーを再起動しますと思いきや再起動しなくても
反映されます。
上記を行ってタイトルエラーを回避しました。