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