[原创]ORA-3136的解决方法_MySQL, Oracle及数据库讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  MySQL, Oracle及数据库讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 2820 | 回复: 0   主题: [原创]ORA-3136的解决方法        下一篇 
xiaogang.xu
注册用户
等级:上士
经验:251
发帖:13
精华:0
注册:1970-1-1
状态:离线
发送短消息息给xiaogang.xu 加好友    发送短消息息给xiaogang.xu 发消息
发表于: IP:您无权察看 2016-8-16 11:33:06 | [全部帖] [楼主帖] 楼主

             ORA-3136的解决方法

一.背景介绍

查看ALERT日志时,经常看到:WARNING:inbound connection timed out (ORA-3136)

二.与数据库连接相关的文件介绍

在$ORACLE_HOME/network/admin下有3个文件,分别是:  listener.ora, sqlnet.ora和 tnsnames.ora,它们与远程客户端能否接入数据库休切相关。在$ORACLE_HOME/network/admin如果没有这文件,可以手工从samples文件夹下copy来,然后根据实际情况修改;或者使用netmgr(11g)、netca(10g)命令来创建个命令是图形化的界面,配置起来比较简单,这里不再做赘述。

2.1  listener.ora

 listener.ora文件是服务端的文件,是listener监听器进程的配置文件 。listener进程为instance提供服务,其接受远程对数据库的接入申请并转交给Oracle的服务器进程。所以如果不是使用的远程的连接,listener进程就不是必需的,如果关闭listener进程并不会影响已经存在的数据库连接。

istener.ora的内容如下:

SID_LIST_LISTENER =

  (SID_LIST =

    (SID_DESC =

      (SID_NAME = xxg)

      (ORACLE_HOME = E:\oracle\product\10.2.0\db_3)

      (PROGRAM = extproc)

    )

  )

 

LISTENER =

  (DESCRIPTION_LIST =

    (DESCRIPTION =

      (ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521))

      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0))

    )

  )

其共分为两个部分,前面一部分指出istener为哪个实例服务,后面一部分表明监听器监听的协议,IP,端口 等。

2.2  tnsnames.ora

tnsnames.ora文件放在客户端机器上,其内容如下:

XXG =

  (DESCRIPTION =

    (ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521))

    (CONNECT_DATA =

      (SERVER = DEDICATED)

      (SERVICE_NAME = xxg)

    )

  ) 

提供tnsname到主机名或者ip的对应(类似于UNIX/LINUX的hosts文件),只有当sqlnet.ora中有类似names.directory_path= (tnsnames)  这样的参数时,也就是客户端解析连接字符串的顺序中有tnsnamesORACLE才会使用这个文件,去寻找对应的ORACLE服务端。

2.3  sqlnet.ora

sqlnet.ora 保存了客户端网络行为的配置信息,其控制着客户端Oracle Net Services的行为,总体功能为

(1). Specify theclient domain to append to unqualified names

(2). Prioritize naming methods

(3). Enable loggingand tracing features

(4). Routeconnections through specific processes

(5). Configure parameters for external naming

(6). Configure Oracle Advanced Security

(7). Useprotocol-specific parameters to restrict access to the database

 这些功能是通过一系列的参数来控制的,具体的参数及其作用在$ORACLE_HOME/NETWORK/ADMIN/SAMPLE/ SQLNET.ORA里面有详细说明,这里不再列出。一般sqlnet.ora的内容如下: 

SQLNET.AUTHENTICATION_SERVICES= (NTS)     --操作系统认证

NAMES.DIRECTORY_PATH= (TNSNAMES, ONAMES)  --客户端解析连接字符串的顺序

这样一来以3个文件的关联就有了当你输入sqlplus xxg/xxg@xxgl的时候

1. 查询sqlnet.ora看看名称的解析方式,发现是tnsname xxg

2. 则查询tnsnames.ora文件,从里边找xxg的记录,并且找到主机名,端口

3. 如果listener进程没有问题的话,建立与listener进程的连接。

4. 根据不同的服务器模式如专用服务器模式或者共享服务器模式,listener采取接下去的动作。默认是专用服务器模式,没有问题的话客户端就连接上了数据库的server process。

     5. 这时候网络连接已经建立,listener进程的使命也就完成了。

在建立与数据库连接的过程中,如果在归定的时间内,客户端没有提供正确的认证信息,服务器会自动中止该连接请求,这时WARNING: inbound connection timed out (ORA-3136)就出现了。

三.WARNING: inbound connection timed out (ORA-3136)出现的原因

这个错误跟 sqlnet.ora中的一个参数有关:SQLNET.INBOUND_CONNECT_TIMEOUT

这个参数是指客户端连接数据库服务认证的时间长,即用户连接DB的时间,单位是秒。 当客户端在INBOUND_CONNECT_TIMEOUT指定的时间内没有成功连接上服务器那么在服务器的sqlnet.log里就会记录下客户端的IP和ORA-12170:TNS:Connect timeout occurred的错误信息。 同时客户端接收到ORA-12547:TNS:lost contact 或者ORA-12637:Packet receive failed的错误。在oracle10.2.0.1之前,这个参数默认是0s。即不受连接时间的限制。在这个版本之后,为了防止Dos的攻击,将默认值该成60s.

ORACLE给出了三种可能导致这个错误的原因

(1) Server gets a connectionrequest from a malicious client which is not supposed to connect to thedatabase , in which case the error thrown is the correct behavior. Youcan get the client address for which the error was thrown via sqlnet logfile.

--存在恶意的攻击,可以在sqlnet log里查看地址信息。

(2) The server receives a validclient connection request but the client takes a long time to authenticate morethan the default 60 seconds.

--服务端接收了客户端的请求,但是客户端用了超过默认60秒的时间验证。

(3) The DB server is heavily loadeddue to which it cannot finish the client logon within the timeoutspecified.

--DB Server 负载较大,来不及响应客户端的请求

. 解决方法

4.1 增加连接时间

一般情况下60s是够用的,如果60秒还报ORA-3136的错误。 Oracle 的解决方法是增加这个时间,用更多的时间来连接。 sqlnet.oralistener.ora作以下添加或修改:

(1)sqlnet.ora

SQLNET.INBOUND_CONNECT_TIMEOUT= 120

(2)listener.ora

     INBOUND_CONNECT_TIMEOUT_<listenername> = 120

(3)重启监听

     这样设置以后,如果客户端仍然在指定的时间没有连接到DB, 需要检查网络质量和DB的负载,从这两个方面去着手解决了,因为客户端花两分钟用来进行与数据库的连接,时间显得太长了。

4.2 关闭超时限制

在安全上允许的情况下,设置如下参数为0以关闭连接超时的限制:

(1)listener.ora:

INBOUND_CONNECT_TIMEOUT_LISTENER=0

 

(2)sqlnet.ora:

SQLNET.INBOUND_CONNECT_TIMEOUT=0

 

(3)重启监听

 

五.参考文档

Note465043.1  Troubleshooting ORA - 3136WARNING Inbound Connection Timed Out





赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论