日期:2014-05-16  浏览次数:20469 次

ORA-3136报错

当使用错误的用户名或密码登陆数据库时,会提示如下报错内容:

bash-4.1$ sqlplus a/a@test


SQL*Plus: Release 10.2.0.4.0 - Production on Sun Sep 15 17:06:51 2013
Copyright (c) 1982, 2007, Oracle.  All Rights Reserved.
ERROR:
ORA-01017: invalid username/password; logon denied

Enter user-name: 


此时不要做任何操作,然后等待一分钟,从alert日志中可以查到如下内容:

WARNING: inbound connection timed out (ORA-3136)


从MOS的465043.1:Troubleshooting ORA-3136: WARNING Inbound Connection Timed Out,这篇文章找到一些端倪:

        这个报错指出客户端连接没有在规定的时间内通过认证,这个时间是由SQLNET.INBOUND_CONNECT_TIMEOUT参数决定的。

        此时在sqlnet.log($ORACLE_HOME/network/log)中可以看到有ORA-12170或TNS-12535的报错(服务端)。信息中应该包含连接的客户端地址,这将有助于判断这个问题。但是一些应用或者JDBC thin driver的应用可能没有此类信息。默认情况下,在11g以后的版本中,sqlnet.log日志不会产生。

        从10.2.0.1以后的版本,参数SQLNET.INBOUND_CONNECT_TIMEOUT的默认设置是60秒。如果客户端没能在60秒内完成验证,在alert日志中就会出现Warning信息,客户端连接被终止。

        这种超时限制主要用于阻止Dos(Denial of Service)服务攻击,防止大量的恶意客户端请求涌向数据库服务器,以消耗其资源。

        对于这种报错的几种可能的原因:

1. 服务器接收到来自于不支持连接此数据库的大量客户端恶意请求。这种情况下,需要抛出这种错误以及相应的行为。通过sqlnet.log中记录的客户端地址,找到错误根源。

2. 服务器接收到一个合法的客户端连接请求,但是客户端花费了比默认60秒更长的时间来完成验证。

3. 数据库服务器当前负载很重,以至于不能在规定的时间内完成客户端登陆验证。

        为了了解这种错误的原因,可能需要如下的检查:

默认60秒的值在大多数数据库服务器验证客户端请求的情况下是合适的。如果这个过程时间太长,那么在寻找解决方法之前可以先检查如下选项:

1. 检查数据库服务器的本地连接是否正常,速度是否合适。

2. 如果本地连接比较快,那么可以在网络管理员的帮助下检查网络延迟。

3. 检查数据库性能是否下降。

4. 检查alert日志中是否有其它严重的报错,例如ORA-600或ORA-7445,如果有,那么先解决它们。

这些严重的报错可能引发数据库服务器的缓慢。

        为了解决这个问题,通常有必要增加监听和数据库的INBOUND CONNECT TIMEOUT的取值。通常建议设置数据库取值(sqlnet.ora)比监听取值(listener.ora)略高。验证过程更依赖于数据库而不是监听。

        可以遵照如下说明并重启监听,来设置这些参数取值为大于默认60秒。不需要重启数据库:

编辑服务端的sqlnet.ora文件,添加这个参数:

SQLNET.INBOUND_CONNECT_TIMEOUT=<n>

<n>代表秒。

例如:

SQLNET.INBOUND_CONNECT_TIMEOUT = 120

编辑listener.ora文件,添加这个参数:

INBOUND_CONNECT_TIMEOUT_<listenername> = <n>

<n>代表超时的秒。