TNS-12535:TNS:操作超时 – Oracle DB

我看到很多来自.Net数据访问服务器的查询,我保持超时。 它看起来完全是随机的,与数据或数据锁无关。 例如,以下查询超时!

SELECT NULL FROM DUAL 

系统日志显示,当它发生CPU是在20%,内存42%,磁盘3%。 到底是怎么回事?

数据库是HPUX上的版本10.2.0.3.0。 ODP驱动程序是2.111.6.20(11g驱动程序)

我检查了sqlnet.log,发现了大量的这些错误消息:

 *********************************************************************** Fatal NI connect error 12170. VERSION INFORMATION: TNS for HPUX: Version 10.2.0.3.0 - Production Oracle Bequeath NT Protocol Adapter for HPUX: Version 10.2.0.3.0 - Production TCP/IP NT Protocol Adapter for HPUX: Version 10.2.0.3.0 - Production Time: 29-JUN-2009 06:42:04 Tracing not turned on. Tns error struct: ns main err code: 12535 TNS-12535: TNS:operation timed out ns secondary err code: 12606 nt main err code: 0 nt secondary err code: 0 

特定的错误以及发生在针对数据库运行的所有应用程序的事实将强烈指出networking呃逆是问题的根源。

  • TNS别名如何解决? 你使用的是本地的tnsnames.ora文件吗?

  • 假设您正在使用本地tnsnames.ora文件,是使用IP地址或主机名的数据库的TNS别名? 使用IP地址消除了对DNS的需求,因此如果问题在于您的DNS服务器正在发生变化,可能值得尝试。

  • 您也可以尝试configuration备份侦听器并向TNS别名添加故障转移选项。 如果问题在于networking随机打乱并丢失了来自客户端的数据包到监听器的通信,那么拥有可以尝试的故障切换选项可以解决绝大多数问题,而无需弄清楚networking中的哪一部分正在发生变化。 当然,这假定问题能够迅速纠正,下一次连接尝试成功,但这可能是一个合理的假设。 如果添加备份侦听程序可以解决问题,则可以确定这是networking问题。

我发现closures连接池更可靠。 我遇到了你描述的几种情况。

事实certificate,这些连接在重新放入游泳池之前进行了testing,而不是在将它们拉出以备后用时使用。

在美好的一天,你会得到某种错误。 在糟糕的一天,你只是等待使用一个完全搞砸的连接,永远不会工作。

如果你打算使用池,我读了你对会话执行alter命令的build议。 (不,我不知道一个好的,Oracle在手册中没有更清楚)

布拉德

当以下条件成立时,我遇到了这个问题: – JDBC客户端在IP ZZ.ZZ.ZZ.ZZ的计算机上运行 – 数据库服务器有两个NIC – 一个IP地址为XX.XX.XX.XX,另一个使用YY。 YY.YY.YY – JDBC客户端URL指向IP XX.XX.XX.XX,端口1521 – 使用路由表,客户端ZZ.ZZ.ZZ.ZZ能够达到XX.XX.XX.XX – 默认的“LISTENER”正在监听YY.YY.YY.YY端口1521,(主机名parsing为这个IP) – SPFILE中的LOCAL_LISTENER参数是NULL – 这是从来没有设置

我通过执行以下操作解决了这个问题: – 停止了侦听器(lsnrctl stop) – 更改了LISTENER.ORA来侦听XX.XX.XX.XX(而不是YY.YY.YY.YY的主机名缺省值) – 添加了一个条目在TNSNAMES.ORA中设置本地侦听器(LISTENER =(…)),本质上是LISTENER.ORA中使用的条目的副本) – 在spfile中添加了一个参数LOCAL_LISTENER = LISTENER(ALTER SYSTEM SET … SCOPE = SPFILE ) – 重新启动LISTENER(lsnrctl start) – 重新启动数据库

没有足够的信息来提出解决scheme,但是这里有几件事要尝试。

你能在应用程序之外重现吗? 你有没有看到tnsping失败? 你能ping通服务器吗?

该应用程序是否并行运行多个连接? 连接数是否有限制?

networking怎么样 – 应用程序和数据库之间是否有防火墙?

虽然这是治疗症状,而不是任何networking堆栈疾病,你可以尝试增加inbound_connect_timeout,看看问题是否消失。

要检查您现在正在运行的是什么,请在数据库主机上调用LSNRCTL并发出以下命令:

显示inbound_connect_timeout

你必须在你的db主机的sqlnet.ora和listener.ora文件中改变它:

sqlnet.ora:SQLNET.INBOUND_CONNECT_TIMEOUT = 100(假设100比你当前的超时大)

listener.ora:INBOUND_CONNECT_TIMEOUT_yourLIstenerNameGoesHere = 100

检查你的防火墙。 数据库服务器上的入站端口1521应该是打开的(如果您从另一台服务器连接到数据库服务器)。

我刚刚设法解决这个问题,我发现如果你在DHCP服务器上运行,确保你的主机文件有当前正确的IP地址, C:\windows\system32\drivers\etc\host记事本)这将解决您的问题。

其他提示:请检查您的服务器/ PC防火墙设置。 在一些Windows操作系统如Vista / Win7 / Win Server上; SOHOnetworking电脑启用防火墙。 确保testing所有networking组private / office / public。 然后停止防火墙服务并testing连接。