sqlnet.ora 与 WARNING-inbound connection timed out (ORA-3136) 分析

Alert log 中经常能看到这个错误:WARNING: inbound connection timed out (ORA-3136) 这个是个很常见的错误。 我们下面来分析下为什么会产生这个错误。

. sqlnet.ora 说明

在讲这个错误之前,我们先看下sqlnet.ora

正常情况下,在$ORACLE_HOME/network/admin下有3个文件:

listener.ora, sqlnet.ora tnsnames.ora

如:

[oracle@qs-dmm-rh1 admin]$ pwd

/u01/app/oracle/product/11.2.0/dbhome_1/network/admin

[oracle@qs-dmm-rh1 admin]$ ls

listener.ora samples shrept.lst sqlnet.ora tnsnames.ora

如果没有这个文件,可以手工的从samples文件夹下copy出来,或者使用netmgrnetca命令来创建。 2个命令是图形化的界面,配置起来比较简单。

listener.ora文件保存的是DB的监听信息:

[oracle@qs-dmm-rh1 admin]$ cat listener.ora

# listener.ora Network Configuration File: /u01/app/oracle/product/11.2.0/dbhome_1/network/admin/listener.ora

# Generated by Oracle configuration tools.

LISTENER =

(DESCRIPTION =

(ADDRESS = (PROTOCOL = TCP)(HOST = localhost6.localdomain6)(PORT = 1521))

)

SID_LIST_LISTENER =

(SID_LIST =

(SID_DESC =

(GLOBAL_DBNAME = orcl)

(ORACLE_HOME = /u01/app/oracle/product/11.2.0/dbhome_1)

(SID_NAME = orcl)

)

)

--静态注册

ADR_BASE_LISTENER = /u01/app/oracle

[oracle@qs-dmm-rh1 admin]$

这个是我在Oracle 11gR2下用netmgr配置的一个监听文件。一般情况下,一台服务器只有一个实例。 如果有多个实例的话,也没有关系,在没有配置静态注册的话,PMON会自动将实例的信息注册到Listener中。 不过PMON需要到mount状态以后才能注册。 所以就需要配置静态注册。

tnsnames.ora 保存的是Service Name的信息:

[oracle@qs-dmm-rh1 admin]$ cat tnsnames.ora

ORCL_ST =

(DESCRIPTION =

(ADDRESS_LIST =

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

)

(CONNECT_DATA =

(SERVICE_NAME = orcl)

)

)

ORCL_PD =

(DESCRIPTION =

(ADDRESS_LIST =

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

)

(CONNECT_DATA =

(SERVICE_NAME = orcl)

)

)

sqlnet.ora 保存的是DBprofile信息:

sqlnet.ora 保存了profile的配置信息。 该文件默认保存在$ORACLE_HOME/network/admin下,也可以保存在$TNS_ADMIN指定的目录下。

sqlnet.ora文件具有如下功能:

(1). Specify the client domain to append to unqualified names

(2). Prioritize naming methods

(3). Enable logging and tracing features

(4). Route connections through specific processes

(5). Configure parameters for external naming

(6). Configure Oracle Advanced Security

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

sqlnet.ora 文件的 Profile Parameters 如下:

(1). BEQUEATH_DETACH

(2). DEFAULT_SDU_SIZE

(3). DISABLE_OOB

(4). NAMES.DEFAULT_DOMAIN

(5). NAMES.DIRECTORY_PATH

(6). NAMES.LDAP_AUTHENTICATE_BIND

(7). NAMES.LDAP_PERSISTENT_SESSION

(8). RECV_BUF_SIZE

(9). SDP.PF_INET_SDP

(10). SEC_USER_AUDIT_ACTION_BANNER

(11). SEC_USER_UNAUTHORIZED_ACCESS_BANNER

(12). SEND_BUF_SIZE

(13). SQLNET.ALLOWED_LOGON_VERSION

(14). SQLNET.AUTHENTICATION_KERBEROS5_SERVICE

(15). SQLNET.AUTHENTICATION_SERVICES

(16). SQLNET.CLIENT_REGISTRATION

(17). SQLNET.CRYPTO_CHECKSUM_CLIENT

(18). SQLNET.CRYPTO_CHECKSUM_SERVER

(19). SQLNET.CRYPTO_CHECKSUM_TYPES_CLIENT

(20). SQLNET.CRYPTO_CHECKSUM_TYPES_SERVER

(21). SQLNET.ENCRYPTION_CLIENT

(22). SQLNET.ENCRYPTION_SERVER

(23). SQLNET.ENCRYPTION_TYPES_CLIENT

(24). SQLNET.ENCRYPTION_TYPES_SERVER

(25). SQLNET.EXPIRE_TIME

(26). SQLNET.INBOUND_CONNECT_TIMEOUT

(27). SQLNET.KERBEROS5_CC_NAME

(28). SQLNET.KERBEROS5_CLOCKSKEW

(29). SQLNET.KERBEROS5_CONF

(30). SQLNET.KERBEROS5_KEYTAB

(31). SQLNET.KERBEROS5_REALMS

(32). SQLNET.OUTBOUND_CONNECT_TIMEOUT

(33). SQLNET.RADIUS_ALTERNATE

(34). SQLNET.RADIUS_ALTERNATE_PORT

(35). SQLNET.RADIUS_ALTERNATE_RETRIES

(36). SQLNET.RADIUS_AUTHENTICATION

(37). SQLNET.RADIUS_AUTHENTICATION_INTERFACE

(38). SQLNET.RADIUS_AUTHENTICATION_PORT

(39). SQLNET.RADIUS_AUTHENTICATION_RETRIES

(40). SQLNET.RADIUS_AUTHENTICATION_TIMEOUT

(41). SQLNET.RADIUS_CHALLENGE_RESPONSE

(42). SQLNET.RADIUS_SECRET

(43). SQLNET.RADIUS_SEND_ACCOUNTING

(44). SQLNET.RECV_TIMEOUT

(45). SQLNET.SEND_TIMEOUT

(46). SSL_CERT_REVOCATION

(47). SSL_CERT_FILE

(48). SSL_CERT_PATH

(49). SSL_CIPHER_SUITES

(50). SSL_CLIENT_AUTHENTICATION

(51). SSL_SERVER_DN_MATCH

(52). SSL_VERSION

(53). TCP.CONNECT_TIMEOUT

(54). TCP.EXCLUDED_NODES

(55). TCP.INVITED_NODES

(56). TCP.VALIDNODE_CHECKING

(57). TCP.NODELAY

(58). TNSPING.TRACE_DIRECTORY

(59). TNSPING.TRACE_LEVEL

(60). USE_CMAN

(61). USE_DEDICATED_SERVER

(62). WALLET_LOCATION

(63). WALLET_OVERRIDE

参数比较多,在这里只看与我们错误相关的一个参数:

SQLNET.INBOUND_CONNECT_TIMEOUT

这个参数是指客户端连接数据库服务认证的时间长,即用户连接DB的时间的,单位是秒。 client INBOUND_CONNECT_TIMEOUT指定的时间内没有成功连接上服务器(db 负载大,网络延时等原因)。 那么在服务器的sqlnet.log里就会记录下客户端的IPORA-12170: TNS:Connect timeout occurred的错误信息。 同时客户端接收到ORA-12547: TNS:lost contact 或者ORA-12637: Packet receive failed的错误。

oracle 10.2.0.1之前,这个参数默认是0s即不受连接时间的限制。在这个版本之后,为了防止Dos的攻击,将默认值该成60s.

. 演示一个案例

2.1 修改sqlnet.ora

添加参数:

SQLNET.INBOUND_CONNECT_TIMEOUT = 10

我测试的Oracle 11gR2. 不需要重启监听程序。 不过在另一篇官文档看到说要重启监听和DB 如果没有生效的,就重启一下监听看看。

2.2 在客户端用错误的用户名和密码连接服务器

C:/Users/Administrator.DavidDai>sqlplus system/[email protected]:1521/dave

SQL*Plus: Release 11.2.0.1.0 Production on 星期三 3 9 22:28:11 2011

Copyright (c) 1982, 2010, Oracle. All rights reserved.

ERROR:

ORA-01017: invalid username/password; logon denied

请输入用户名:

保持这个窗口不要关闭。

2.3 查看alert log

10秒钟之后,就会多出如下信息:

Fatal NI connect error 12170.

VERSION INFORMATION:

TNS for Linux: Version 11.2.0.1.0 - Production

Oracle Bequeath NT Protocol Adapter for Linux: Version 11.2.0.1.0 - Production

TCP/IP NT Protocol Adapter for Linux: Version 11.2.0.1.0 - Production

Time: 09-MAR-2011 22:31:31

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

nt OS err code: 0

Client address: (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.8.21)(PORT=53486))

WARNING: inbound connection timed out (ORA-3136)

--如果客户端的连接程序没有关闭,会一直挂在着

Wed Mar 09 22:32:36 2011

--客户端连接关闭之后,显示最后一行。

也可以查看sqlnet.log 文件:


[xezf@localhost log]$ pwd
/home/oracle_app/network/log
[xezf@localhost log]$ ls
listener.log sqlnet.log
[xezf@localhost log]$ tail -20 sqlnet.log
Client address: (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.2.222)(PORT=56927))




***********************************************************************
Fatal NI connect error 12170.


VERSION INFORMATION:
TNS for Linux: Version 10.2.0.1.0 - Production
Oracle Bequeath NT Protocol Adapter for Linux: Version 10.2.0.1.0 - Production
TCP/IP NT Protocol Adapter for Linux: Version 10.2.0.1.0 - Production
Time: 23-9ÔÂ -2011 17:56:21
Tracing not turned on.
Tns error struct:
ns main err code: 12535
TNS-12535: TNS: ²Ù×÷³¬Ê±
ns secondary err code: 12606
nt main err code: 0
nt secondary err code: 0
nt OS err code: 0
Client address: (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.2.222)(PORT=60941))



. 解决方法

一般情况下60s是够用的,如果60秒还报ORA-3136的错误。 Oracle 的解决方法是增加这个时间,用更多的时间来连接。 Oracle 建议的修改方式如下:

3.1 修改sqlnet.ora

Timeout 设成120

SQLNET.INBOUND_CONNECT_TIMEOUT = 120

3.2 修改listener.ora

添加参数:

INBOUND_CONNECT_TIMEOUT_<listenername> = 110

加上监听名称,我的例子中的监听是LISTENER. 所以设成:

INBOUND_CONNECT_TIMEOUT_ LISTENER = 110

注意:

inbound_connect_timeout_listener_name 参数的值要小于sqlnet.inbound_connect_timeout 的值。

这样设置以后,如果clients因为系统或者网络的原因在指定的时间没有连接到DB,那么Oracle会根据需要来增加连接的时间。

---------------------------------------------------------------------------------------------------

Blog http://blog.csdn.net/tianlesoftware

网上资源: http://tianlesoftware.download.csdn.net

相关视频:http://blog.csdn.net/tianlesoftware/archive/2009/11/27/4886500.aspx

DBA1 群:62697716(); DBA2 群:62697977() DBA3 群:62697850()

DBA 超级群:63306533(); DBA4 群: 83829929 DBA5群: 142216823

聊天 群:40132017

--加群需要在备注说明Oracle表空间和数据文件的关系,否则拒绝申请

你可能感兴趣的:(Connection)