ORA-12542 TNS 地址已被占用

今日客户数据库连接报错,在使用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 端口耗尽造成的,请在客户端计算机上执行以下步骤:

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

  2. 执行以下操作之一:

    • 在 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 端口耗尽及其相关问题:

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

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

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

     

     

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

    Aa560610.Caution(zh-CN,BTS.10).gif警告
    如果注册表编辑器使用不当,则可能会产生严重问题,导致重新安装操作系统。Microsoft 不保证可以解决因注册表编辑器使用不当而造成的问题。请慎用注册表编辑器,风险自负。在修改注册表之前,请务必备份注册表,并确保您知道在发生问题时如何使用备份进行还原。有关如何备份、还原及修改注册表的详细信息,请参阅 Microsoft 知识库文章“Microsoft Windows 注册表说明”,网址为 http://go.microsoft.com/fwlink/?LinkId=62729

     

     

    增加动态分配到客户端 TCP/IP 套接字连接的临时端口的上限。

    1. 启动注册表编辑器。

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

      HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters

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

       

      值名称

      MaxUserPort

      值数据

      <在此输入一个 5000 到 65534 之间的十进制值>

    4. 关闭注册表编辑器。

      Aa560610.note(zh-CN,BTS.10).gif注意
      必须重新启动计算机,此更改才会生效。

       

       

      Aa560610.note(zh-CN,BTS.10).gif注意
      增加用于客户端 TCP/IP 连接的临时端口的范围将占用 Windows 内核内存。请勿将此设置的值增加至超过容纳客户端应用程序套接字连接所需要的值,以便尽可能降低对 Windows 内核内存的不必要占用。

       

       

    降低客户端 TCP/IP 套接字连接的超时值(默认值为 240 秒)

    1. 启动注册表编辑器。

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

      HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters

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

       

      值名称

      TcpTimedWaitDelay

      值数据

      <在此输入一个 30 到 240 之间的十进制值。>

    4. 关闭注册表编辑器。

      Aa560610.note(zh-CN,BTS.10).gif注意
      必须重新启动计算机,此更改才会生效。

       

       

      Aa560610.note(zh-CN,BTS.10).gif注意
      此值的有效范围为 30 到 300(十进制)之间。默认值为 240。



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

你可能感兴趣的:(ORA-12542 TNS 地址已被占用)