Oracle 運用に関するエラー

ORA-12542: TNS: アドレスがすでに使用中です。

データベースの接続側(AP サーバーや PC クライアント)で発生する場合

原因

自分自身または並行稼働するアプリケーションからの接続と切断を繰り返し行なっている場合、クライアント側のエフェメラルポート(※1) が枯渇していることが考えられる。
(※1) エフェメラルポート(ephemeral port):短命なポートを意味で一時的な通信のために様々なアプリケーションが自由に利用できるポート。接続と切断で 1 ポート消費される。
特に Windows のデフォルトのエフェメラルポートは 1024 〜 5000 の間の約 4000 ポートが利用可能と比較的小さく一度利用されたポートは4分(2400秒)再利用できない。

調査

現象再発時にクライアント側にて OS コマンドの netstat -a を実行し、サーバー側の リスナーのポート番号(デフォルト 1521)を含む数千行の WAIT_TIME が発生していることを急いで確認。(約4分で次々と消えていく)

  • netstat -a
    mypc から dbserver に対して接続(切断済)したポート CLOSE 待ちの状態
C:\> netstat -a
Active Connections
  Proto  Local Address  Foreign Address       State
 
  ・・・・・・・・・約 4000行
  TCP    mypc:4996      dbserver:1521         TIME_WAIT   ←  解放(CLOSE) 待ち
  TCP    mypc:4997      dbserver:1521         TIME_WAIT   ←  同上
  TCP    mypc:4998      dbserver:1521         TIME_WAIT   ←  同上
  TCP    mypc:4999      dbserver:1521         ESTABLISHED ←  接続中
  ・・・・・・・・・    ↑                  ↑
           エフェメラルポート  リスナーのポート

対応

エフェメラルポートの範囲(最大値)を広げる、または、TIME_WAIT ソケットのタイムアウト時間を短くする。 または、その両方を行なう。

Windows の場合レジストリエディタを使用し、
キー名称 「HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters」に DWORD 値 「MaxUserPort」 または DWORD 値「TcpTimedWaitDelay」を更新(追加)する。Windows の再起動後に有効

デフォルト値: MaxUserPort:5000(1024〜5000) / TcpTimedWaitDelay : 240(秒)

MaxUserPort        REG_DWORD    0x0001388 (5000)    またはキー無し
TcpTimedWaitDelay  REG_DWORD    0x00000f0 (240)     またはキー無し

根本的な対応としては、Webアプリケーションならコネクションプーリングを使用しているかを確認する。プログラムのループ内の条件によって DB に接続、切断を繰り返すような行儀の悪いプログラムが存在しないか確認する。
この問題を抱えたアプリケーションは高負荷時に ORA-12541: TNS: リスナーがありません。 を併発する可能性も高いので同時に対処することをお勧めする。



類似するエラー

関連事項

 

一覧ページへ戻る

OTN (Oracle Technology Network)によるエラーメッセージによる情報だけでは、対処に困ったエラーについてのプラクティスです。
ベスト・プラクティスというわけではないので、書いてあることに固執しないで広い視野でエラー対応してください。

ORA-12542の関連トピックス

日本オラクル
■ 日本オラクル 株式会社
■ オラクルマスター資格 (オラクルマスターとは
■ Oracle Web セミナー