Oracleエラー対応(ORA-03136):ORA-03136発生時の対処方法について

現役DBAが解説 ~Oracleエラー対応~

クライアントとサーバ間の接続時に、 ORA-03136が発生する可能性があります。

本記事では、 ORA-03136発生時の原因および対応方法を解説します。

1.エラーメッセージ

アラートログに下記のようなエラーが出力されます。

Fatal NI connect error 12170.

VERSION INFORMATION:
TNS for IBM/AIX RISC System/6000: Version 11.2.0.1.0 - Production
TCP/IP NT Protocol Adapter for IBM/AIX RISC System/6000: Version 11.2.0.1.0 - Production
Oracle Bequeath NT Protocol Adapter for IBM/AIX RISC System/6000: Version 11.2.0.1.0 - Production
Time: 19-JUN-2023 06:05:04
Tracing not turned on.
Tns error struct:
ns main err code: 12535

TNS-12535: TNS:operation timed out
ns secondary err code: 12606
nt main err code: 0
nt secondary err code: 0
nt OS err code: 0

Client address: (ADDRESS=(PROTOCOL=tcp)(HOST=10.a.b.c)(PORT=12345))
WARNING: inbound connection timed out (ORA-3136)

アラートログに出力される「WARNING: inbound connection timed out (ORA-3136)」は、SQLNET.INBOUND_CONNECT_TIMEOUTのパラメータで指定される時間の間にクライアントからの接続がその認証処理を完了しなかったことを示します。
このパラメータのデフォルト値は60秒です。

アラートログに (HOST=10.a.b.c)(PORT=12345))といった、クライアントIPアドレスとポートが出力されます。
クライアントIPアドレスとポートについてリスナーログを確認し、リスナーログのエントリを特定します。

Mon Jun 19 06:04:04 2023 * (CONNECT_DATA=(SID=<instance_name>)(CID=(PROGRAM=E:Program_Files_x86myapp.bin)(HOST=<myclient>)(USER=<myuser>))) * (ADDRESS=(PROTOCOL=tcp)(HOST=10.a.b.c)(PORT=12345)) * establish

このケースでは、アラートログ、リスナーログに出力されたタイムスタンプの差が60秒であることから、SQLNET.INBOUND_CONNECT_TIMEOUTの設定値である60秒で、クライアントがその時点で認証に失敗したことが分かります。

2.エラー原因・対処方法

本記事ではORA-03136が発生する代表的なケースをご紹介します。

2-1 ネットワークの接続不具合

クライアントとサーバ間のネットワーク接続時に通信上の問題があった場合、本エラーが発生します。
ネットワーク機器やファイアウォールの設定などを確認し、必要に応じて修正を実施します。

2-2 sqlnet.oraの設定値が小さすぎる場合

sqlnet.oraにINBOUND_CONNECT_TIMEOUTを現在よりも大きい値で設定します。
サーバ側のsqlnet.oraに下記のパラメータを設定します。

SQLNET.INBOUND_CONNECT_TIMEOUT=120

データベースが共有サーバモードでなければ、リスナーとデータベースの再起動は不要です。
設定変更後の新規接続から、この設定が有効となります。

SQLNET.INBOUND_CONNECT_TIMEOUTの変更が反映されているのかを確認する手順は以下になります。

1.専用サーバ接続の場合

サーバのトレースをサポートレベルで取得することでタイムアウトの設定値を以下のように表示できます。

niotns: Enabling CTO, value=120000 (milliseconds) <== 120="" seconds="" br="">niotns: Not enabling dead connection detection.
niotns: listener bequeathed shadow coming to life...

2.共有サーバ接続の場合

TELNETセッションが120秒後に切断された場合、SQLNET.INBOUND_CONNECT_TIMEOUTの設定が有効であると分かります。

$ telnet <Database IP address> <port #>

2-3 データベースサーバへの負荷が高い場合

データベースサーバの負荷が高く、タイムアウト指定時間内にクライアントのログオンを完了できない場合に本エラーが発生する場合があります。
データベースサーバの負荷状況を確認し、負荷を低減させる対応について検討が必要です。

また、②の対応同様にINBOUND_CONNECT_TIMEOUTを高い値に設定することも検討します。

3.本事象の発生原因の切り分け

SQLNET.INBOUND_CONNECT_TIMEOUTのデフォルト値の60秒は、データベースサーバがクライアントの認証処理を完了させるためには十分な時間となっています。
もし認証処理に時間がかかる場合、回避策を検討する前に下記事項の確認が有効となります。

  1. データベースサーバのローカル接続が遅延なく完了できるか確認します。
  2. ローカル接続が早い場合には、ネットワーク遅延がないか確認します。
  3. データベースのパフォーマンス遅延がないか確認します。
  4. クリティカルエラーはデータベースサーバの遅延を招く可能性があるため、アラートログにORA‐600やORA-7445などのクリティカルエラーが出力されていないかを確認し、それらを先に解決します。

4.最後に

ORA-03136に関する解説は以上となります。

本エラーが発生する原因は本記事で紹介したもの以外にも多岐にわたるため、具体的な状況に応じた対処法を見つけるためには、詳細なログや状況分析が必要となります。
問題が継続的に発生する場合は、サポートへ相談することをお勧めします。
サポートに問い合わせする際には下記の情報が必要となります。

  • クライアントとサーバにおけるサポートレベルで出力されたネットトレース
  • データベースサーバ側の sqlnet.ora, listener.ora, Sqlnet.log と Alert_〈sid〉.log