ORA-3136 のテストケース

ORA-3136 はクライアントからの接続がリスナーからサーバプロセスにハンドオフされた後の認証処理に時間がかかり、SQLNET.INBOUND_CONNECT_TIMEOUT で指定した時間内(デフォルト60秒)に認証が完了しなかった場合に発生する。

パスワードを間違えた後に入力待ちのままタイムアウト時間を超過した場合などにも発生するのだが、ネットワークの問題で認証に時間がかかるような状況を以下のように再現してみる。

  1. Linux(Oracle Linux 8)でtcコマンドを使ってリスナーがリスニングしているインターフェースで疑似的に応答遅延を発生させる
  2. SQLNET.INBOUND_CONNECT_TIMEOUT を短く設定し、直ちにタイムアウトを発生させる

再現手順

tcコマンドが入っていない場合はiproute-tcパッケージをインストールする。

# dnf install iproute-tc

リスナーがリスニングしているインターフェース(今回は enp0s3 を想定)を事前に確認しておき、tcコマンドで遅延を設定する。1秒程度が良い。

# tc qdisc add dev enp0s3 root netem delay 1000ms

サーバ側のsqlnet.oraにSQLNET.INBOUND_CONNECT_TIMEOUTを追記する。5秒程度でよい。

SQLNET.INBOUND_CONNECT_TIMEOUT=5

この状態でクライアントから接続を行えば、ORA-3136が発生し、アラートログに以下のような出力が行われる。

Fatal NI connect error 12170.

  VERSION INFORMATION:
        TNS for Linux: Version 19.0.0.0.0 - Production
        Oracle Bequeath NT Protocol Adapter for Linux: Version 19.0.0.0.0 - Production
        TCP/IP NT Protocol Adapter for Linux: Version 19.0.0.0.0 - Production
  Version 19.16.0.0.0
  Time: 02-6月 -2023 00:21:47
  Tracing not turned on.
  Tns error struct:
    ns main err code: 12535

TNS-12535: TNS: 操作はタイム・アウトしました。
    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=192.168.100.21)(PORT=44508))
2023-06-02T00:21:47.576894+09:00
WARNING: inbound connection timed out (ORA-3136)

この時、クライアント側には、ORA-3135が返却される。

[oracle@oradbs ~]$ sqlplus system/oracle@vbres19.dn.home/db19

SQL*Plus: Release 19.0.0.0.0 - Production on 金 6月 2 00:21:30 2023
Version 19.18.0.0.0

Copyright (c) 1982, 2022, Oracle.  All rights reserved.

ERROR:
ORA-03135: 接続が失われました
プロセスID: 0
セッションID: 0、シリアル番号: 0

検証が終わったら、ネットワークインターフェースの遅延設定は削除しておく。

# tc qdisc del dev enp0s3 root

コメント