oracle地址已被占用,ORA-12542 TNS 地址已被占用

本文档详细描述了当使用PL/SQL尝试连接Oracle数据库时遇到ORA-12542 TNS地址已被占用的错误。问题出现在一台特定机器上,而其他服务器客户端可以正常连接。故障排查过程中,发现是由于Windows客户端的TCP端口资源耗尽导致,特别是当系统处于高交易环境时。解决方案包括增大客户端的可用端口范围、减少TIME_WAIT状态的超时时间或切换到IPC协议。这些更改需要在注册表中进行,并可能需要重启服务器。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今日客户数据库连接报错,在使用plsql进行数据库连接时出现如下报错信息:

ORA-12542 TNS 地址已被占用。

问题排查:

1  使用其他服务器客户端连接数据库正常。

2  只有这一台机器连接数据库异常

查询相关的metalink文档发现如下:

2016/11/22 文档显示

https://support.oracle.com/epmos/faces/SearchDocDisplay?_adf.ctrlstate=

eur163egx_9#SYMPTOM 1/3

TNS-12542 Error When Executing Batch Jobs or in High Transaction Environment (文档 ID

276812.1)

In this Document

Symptoms

Cause

Solution

References

APPLIES TO:

Oracle Net Services - Version 8.1.7.4 to 11.2.0.3 [Release 8.1.7 to 11.2]

Oracle Net Services - Version 11.2.0.4 to 11.2.0.4 [Release 11.2]

Microsoft Windows (32-bit)

Checked for relevance on 30-SEP-2011

Checked for relevance on 14-MAY-2013

SYMPTOMS

TNS-12542 errors in log files when executing batch jobs or in high transaction environments. Client trace

files will show

CLIENT TRACE FILE:

================

(3752) [10-JUN-2004 15:20:50:899] niotns: Calling address:

(DESCRIPTION=(SOURCE_ROUTE=OFF)(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=tst81)(PORT=1526)))(CONNECT_DATA=

(SID=sec)(SRVR=DEDICATED)(CID=(PROGRAM=c:\windows\system32\inetsrv\w3wp.exe)(HOST=SRVPDFTEST)

(USER=userarchive))))

(3752) [10-JUN-2004 15:20:50:899] nscall: connecting...

(3752) [10-JUN-2004 15:20:50:899] nttgetport: port resolved to 1526

(3752) [10-JUN-2004 15:20:50:899] nttbnd2addr: looking up IP addr for host:tst81

(3752) [10-JUN-2004 15:20:50:899] nsopen: opening transport...

(3752) [10-JUN-2004 15:20:50:899] nttcnp: Validnode Table IN use; err 0x0

(3752) [10-JUN-2004 15:20:50:899] nttcni: trying to connect to socket 6628.

(3752) [10-JUN-2004 15:20:50:899] ntt2err: soc 6628 error - operation=1, ntresnt[0]=512, ntresnt[1]=48,

ntresnt[2]=0

(3752) [10-JUN-2004 15:20:50:899] nserror: nsres: id=0, op=65, ns=12542,ns2=12560; nt[0]=512, nt[1]=48,

nt[2]=0; ora[0]=0, ora[1]=0, ora[2]=0

(3752) [10-JUN-2004 15:20:50:899] nsopen: unable to open transport

(3752) [10-JUN-2004 15:20:50:899] nioqper: error from nscall

(3752) [10-JUN-2004 15:20:50:899] nioqper: nr err code: 0

(3752) [10-JUN-2004 15:20:50:899] nioqper: ns main err code: 12542

(3752) [10-JUN-2004 15:20:50:899] nioqper: ns (2) err code: 12560

(3752) [10-JUN-2004 15:20:50:899] nioqper: nt main err code: 512

(3752) [10-JUN-2004 15:20:50:899] nioqper: nt (2) err code: 48

(3752) [10-JUN-2004 15:20:50:899] nioqper: nt OS err code: 0

(3752) [10-JUN-2004 15:20:50:899] niqme: reporting NS-12542 error as ORA-12542

(3752) [10-JUN-2004 15:20:50:899] niomapnserror: returning error 12542

(3752) [10-JUN-2004 15:20:50:899] niotns: Couldn't connect, returning 12542

(432) [10-JUN-2004 15:20:50:899] nstimarmed: no timer allocated

SQLNET.LOG file:

=============

Fatal NI connect error 12542, connecting to:

(DESCRIPTION=(SOURCE_ROUTE=OFF)(ADDRESS=(PROTOCOL=TCP)(HOST=tst81)(PORT=1526))(CONNECT_DATA=(SID=sec)

(SRVR=DEDICATED)(CID=(PROGRAM=c:\windows\system32\inetsrv\w

3wp.exe)(HOST=SRVPDFTEST)(USER=userarchive))))

VERSION INFORMATION:

2016/11/22 文档显示

https://support.oracle.com/epmos/faces/SearchDocDisplay?_adf.ctrlstate=

eur163egx_9#SYMPTOM 2/3

TNS for 32-bit Windows: Version 9.2.0.1.0 - Production

Windows NT TCP/IP NT Protocol Adapter for 32-bit Windows: Version 9.2.0.1.0 - Production

Time: 10-JUN-2004 15:20:50

Tracing to file: E:\oracle\ora92\temp\cli_1732.trc

Tns error struct:

nr err code: 0

ns main err code: 12542

TNS-12542: TNS:address already in use

ns secondary err code: 12560

nt main err code: 512

TNS-00512: Address already in use

nt secondary err code: 48

nt OS err code: 0

CAUSE

The problem is due to the fact that the free TCP ports on the Windows client have been exhausted and it is

trying to make use of a port which is in TIME_WAIT state and which throws the error:

TNS-12542: Address already in use

SOLUTION

There are 3 possible solutions:

1.) Increase the free port range:

======================

Start Registry Editor (Regedt32.exe).

Locate the following key in the registry:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters

On the Edit menu, click Add Value, and then add the following registry value:

Value Name: MaxUserPort Data Type: REG_DWORD Value: 65534

Valid Range: 5000-65534 (decimal) Default: 0x1388 (5000 decimal)

Description: This parameter controls the maximum port number used when an application requests any

available user port from the system. Normally, ephemeral (that is, short-lived) ports are allocated between

the values of 1024 and 5000 inclusive.

2.) Decrease the value for TIME_WAIT state:

================================

TcpTimedWaitDelay (new in Windows NT versions 3.51 SP5 and later)

Key: Tcpip\Parameters

Value Type: REG_DWORD - Time in seconds

Valid Range: 30-300 (decimal)

Default: 0xF0 (240 decimal)

Description: This parameter determines the length of time that a connection will stay in the TIME_WAIT state

when being closed. While a connection is in the TIME_WAIT state, the socket pair

cannot be re- used. This is also known as the "2MSL" state, as by RFC the value should be twice

the maximum segment lifetime on the network. See RFC793 for further details.

Note that any change to TCPIP parameters in the Windows registry would requires a restart of the server.

3.) Use of IPC protocol

==================

2016/11/22 文档显示

https://support.oracle.com/epmos/faces/SearchDocDisplay?_adf.ctrlstate=

eur163egx_9#SYMPTOM 3/3

If the application or failing connection (such as local batch jobs running high transactions) is local to

the Database, use IPC for connectivity, rather than TCP.

The IPC protocol will allow a more intense connection load than TCP will.

See Note:29232.1 for details on IPC.

REFERENCES

NOTE:29232.1 - IPC Explained

关于tcpip连接的文章转载如下:

怎么解决在window下高并发TCP请求端口被占用有关问题

网友分享于:2015-08-26  浏览:273次

如何解决在window下高并发TCP请求端口被占用问题

当客户端启动到服务器的 TCP/IP 套接字连接时,客户端通常连接到服务器上的特定端口,并请求服务器通过临时(或暂时)TCP 或 UDP 端口进行响应。在 Windows Server 2003 和 Windows XP 中,客户端应用程序所使用的临时端口的默认范围为 1025 到 5000。在某些情况下,有可能耗尽默认范围的可用端口。

TCP/IP 端口耗尽会导致连接到 BizTalk Server 的应用程序及连接到远程服务器的 BizTalk 应用程序出现意外错误

TCP/IP 端口耗尽的症状随客户端应用程序的不同而不同,但通常都表现为显示网络连接失败错误。若要确定网络连接失败是否是由 TCP/IP 端口耗尽造成的,请在客户端计算机上执行以下步骤:

在运行 Windows XP 或 Windows Server 2003 的计算机上单击“开始”,再单击“运行”,然后键入 cmd,单击“确定”打开命令提示。

执行以下操作之一:

在 Windows XP 或 Windows Server 2003 计算机上的命令提示中输入以下命令,显示此计算机上 TCP/IP 协议所使用的活动连接:

复制

netstat -n 这将列出绑定到客户端计算机的 TCP/IP 地址以及 TCP/IP 地址与远程服务器通信所使用的端口。如果列出的端口使用了所有可用的端口,则出现了 TCP/IP 端口耗尽现象。

在基于 Windows Server 2003 的客户端计算机的命令提示中输入以下命令,以显示 TCP/IP 协议所使用的活动连接:

复制

netstat -b 这将列出绑定到客户端计算机的 TCP/IP 地址、TCP/IP 地址与远程服务器通信所使用的端口以及使用这些端口的应用程序。此信息可以帮助您确定那个客户端应用程序正在使用过多的 TCP/IP 端口。

与 TCP/IP 端口耗尽有关的问题

当客户端应用程序尝试使用 TCP/IP 套接字连接到 BizTalk Server,或当 BizTalk 应用程序尝试使用 TCP/IP 套接字连接到服务器时,可能会出现类似于下面的情况:

复制

System.Net.WebException: The underlying connection was closed: An unexpected error occurred on a send.

- 或者 -

复制

Unable to connect to the remote server

System.Net.Sockets.SocketException: Only one usage of each socket address (protocol/network address/port) is normally permitted.

当出现这些错误时,还可能出现以下问题:

客户端应用程序可能无法连接到 BizTalk Server。

BizTalk 应用程序服务可能无法连接到远程 SQL 服务器。

BizTalk Server 适配器可能无法连接到远程服务器。

客户端应用程序预留的每个端口均占用内核内存。如果预留了数目超常的客户端端口,Windows 内核内存的占用率将相应增加。

原因

如果客户端计算机中存在数目超常的 TCIP/IP 套接字连接,则客户端计算机上可能出现 TCP/IP 端口耗尽的情况。如果多个客户端应用程序都在建立连接,则可能出现这种情况。

如果所有可用的临时端口都分配给了客户端应用程序,则客户端将出现 TCP/IP 端口耗尽的情况。当 TCP/IP 端口耗尽时,将无法预留客户端端口,并且尝试通过 TCP/IP 套接字连接到服务器的客户端应用程序也将出错。

在高负载情况下,比处于正常负载时更容易出现 TCP/IP 端口耗尽的情况。

解决方法

执行以下步骤以避免 TCP/IP 端口耗尽及其相关问题:

验证客户端应用程序没有生成过多的 TCP/IP 套接字连接。这一点可以用上面提到的方法来检查,即在 Windows Server 2003 和 Windows XP 上运行 netstat -n,或者在 Windows Server 2003 和 2008 上运行 netstat -b。

如果某个客户端应用程序使用了数量超常的 TCP/IP 套接字连接,则应考虑重新设计客户端应用程序,以便更有效地使用 TCP/IP 套接字连接。

79f2cdf4dd3aa51e8eedb2101a1adbbc.png注意

如果为 BizTalk 应用程序服务 (BTSNTSvc.exe) 实例预留了数量超常的客户端端口,则需验证配置为在 BizTalk 应用程序服务中运行的任何自定义代码都没有建立过多的 TCP/IP 套接字连接。

如果大量客户端应用程序要启动已知数量的 TCP/IP 套接字连接,但没有足够数量的可用临时端口来满足连接请求,则需要进行以下注册表修改。

79f2cdf4dd3aa51e8eedb2101a1adbbc.png警告

如果注册表编辑器使用不当,则可能会产生严重问题,导致重新安装操作系统。Microsoft 不保证可以解决因注册表编辑器使用不当而造成的问题。请慎用注册表编辑器,风险自负。在修改注册表之前,请务必备份注册表,并确保您知道在发生问题时如何使用备份进行还原。有关如何备份、还原及修改注册表的详细信息,请参阅 Microsoft 知识库文章“Microsoft Windows 注册表说明”,网址为 http://go.microsoft.com/fwlink/?LinkId=62729。 增加动态分配到客户端 TCP/IP 套接字连接的临时端口的上限。

启动注册表编辑器。

在注册表中,浏览到并单击以下注册表项。

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters

在“编辑”菜单中单击“新建”、“DWORD 值”,然后添加以下注册表值,以增加可以动态分配到客户端的临时端口的数量:

值名称

MaxUserPort

值数据

关闭注册表编辑器。

79f2cdf4dd3aa51e8eedb2101a1adbbc.png注意

必须重新启动计算机,此更改才会生效。

79f2cdf4dd3aa51e8eedb2101a1adbbc.png注意

增加用于客户端 TCP/IP 连接的临时端口的范围将占用 Windows 内核内存。请勿将此设置的值增加至超过容纳客户端应用程序套接字连接所需要的值,以便尽可能降低对 Windows 内核内存的不必要占用。降低客户端 TCP/IP 套接字连接的超时值(默认值为 240 秒)

启动注册表编辑器。

在注册表中,浏览到并单击以下注册表项。

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters

在“编辑”菜单中单击“新建”、“DWORD 值”,然后添加以下注册表值,以缩短关闭连接时,该连接处于 TIME_WAIT 状态的时间。当连接处于 TIME_WAIT 状态时,套接字对无法重新使用:

值名称

TcpTimedWaitDelay

值数据

关闭注册表编辑器。

79f2cdf4dd3aa51e8eedb2101a1adbbc.png注意

必须重新启动计算机,此更改才会生效。

79f2cdf4dd3aa51e8eedb2101a1adbbc.png注意

此值的有效范围为 30 到 300(十进制)之间。默认值为 240。

进行了修改,问题得到解决

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值