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

geek.conf.2

あるインフラエンジニアの備忘録

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リスナーを再起動しますと思いきや再起動しなくても
反映されます。


上記を行ってタイトルエラーを回避しました。