Oracle 监听SQLNET.EXPIRE_TIME

在这边数据库加固有如下一个加固项,使用SQLNET.EXPIRE_TIME可以来断开在session里面超时的状态为inactive的连接。

检查是否设置超时时间

注意事项及影响

  • 作用:非活动会话超过10分钟,连接断开
  • 该项需要与业务侧确认是否可以操作
  • 对于11g (如果有grid)只加固ORACLE用户下的sqlnet.ora ,如果没有则创建
  •  该项加固后,可能在alert 文件中存在ORA-07445: exception encountered: core dump [snstimsane()+43] 报错,(文档 ID 3934729.8),影响版本如下

 

 

序号

操作内容

操作步骤

责任人

时间

1

登陆主机

su - oracle

 

 

2

检查监听和数据库状态

lsnrctl status

sqlplus ‘/as sysdba’

select open_mode from v$database;

 

 

3

进入oracle_home

cd $ORACLE_HOME/network/admin

 

 

4

备份sqlnet.ora

cp sqlnet.ora sqlnet.ora_bak

 

 

5

编辑sqlnet.ora

增加下面的内容

SQLNET.EXPIRE_TIME = 10

 

 

6

检查数据库状态

Select open_mode from v$database;

 

 

 

SQLNET.EXPIRE_TIME

Purpose

Use parameter SQLNET.EXPIRE_TIME to specify a the time interval, in minutes, to send a probe to verify that client/server connections are active. Setting a value greater than 0 ensures that connections are not left open indefinitely, due to an abnormal client termination. If the probe finds a terminated connection, or a connection that is no longer in use, it returns an error, causing the server process to exit. This parameter is primarily intended for the database server, which typically handles multiple connections at any one time.

Limitations on using this terminated connection detection feature are:

It is not allowed on bequeathed connections.

Though very small, a probe packet generates additional traffic that may downgrade network performance.

Depending on which operating system is in use, the server may need to perform additional processing to distinguish the connection probing event from other events that occur. This can also result in degraded network performance.

Default

0

Minimum Value

0

Recommended Value

10

Example

SQLNET.EXPIRE_TIME=10

 

目的

使用参数SQLNET.EXPIRE_TIME指定发送探针以验证客户端/服务器连接是否处于活动状态的时间间隔(以分钟为单位)。设置大于0的值可确保由于客户端终止异常,连接无法无限期保持打开状态。如果探测发现终止连接或不再使用的连接,则会返回错误,导致服务器进程退出。此参数主要用于数据库服务器,该服务器通常一次处理多个连接。

使用此终止连接检测功能的限制是:

遗留连接不允许这样做。

虽然非常小,但探测数据包会产生额外的流量,可能会降低网络性能。

根据正在使用的操作系统,服务器可能需要执行额外的处理以将连接探测事件与发生的其他事件区分开。这也可能导致网络性能下降。

 

默认

0

最低值

0

推荐值

10

SQLNET.EXPIRE_TIME = 10

 

 

DCD: Dead Connection Detection ,可以用于检测、标记僵死而没有断开会session,再由PMON进行清理,释放资源。开启DCD,只需要在服务端的sqlnet.ora文件中SQLNET.EXPIRE_TIME参数,单位为分钟。 
如果时间达到这个值,server端就是发出一个”probe” packet 给客户端,如要客户断是正常的,这个packet就被忽略,timer重新计时;如果客户端异常中断,则server端就会收到一个消息,用以释放连接。

 

SQLNET.EXPIRE_TIME设置客户端连接会话超时时间(单位分钟)

定期检测客户端是否还是活动的,设置为0不检测

SQLNET.EXPIRE_TIME = 10

 

 

这里是别人博客的一个案例

关于sqlnet.expire_time.txt

 

***********************************************************************

 

Fatal NI connect error 12537, connecting to:

(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.xxx.xxx)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=xxxx.com)(CID=(PROGRAM=oracle)(HOST=xxx)(USER=oracle11g))))

 

  VERSION INFORMATION:

    TNS for Linux: Version 11.2.0.4.0 - Production

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

  Time: 18-APR-2014 11:05:46

  Tracing not turned on.

  Tns error struct:

    ns main err code: 12537

 

TNS-12537: TNS:connection closed

    ns secondary err code: 12560

    nt main err code: 507

 

TNS-00507: Connection closed

    nt secondary err code: 0

    nt OS err code: 0

 

如果应该经常出现这样的错误,主要问题可能出现在内网的防火墙设置,如果应用保持连接而长时间没有操作,一些网络设备就会断开连接,解决方法就是通过设置服务端的sqlnet.ora文件的sqlnet.expire_time参数,来主动向客户端发送检测请求,如果客户端还活着,则不做操 作,如果检测发现客户端的连接已经不存在或没有反映,则回收这个session的资源。这样,如果DCD的检测时间小于防火墙设置的空闲连接 最大存活时间,那么由于DCD检测客户端存活性需要从服务端发送一个空包到客户端,防火墙就会重新计算这个连接的空闲时间,就不会中断这个会话了。设置DCD需要在服务端的sqlnet.ora文件中添加以下信息:

sqlnet.expire_time = 5

这个值的单位是分钟,这里设置的是每五分钟服务端会向已连接数据库的session所在的客户端发送一个空包,来检测客户端的存活性, 如果防火墙限制的空闲连接时间大于5分钟,那么连接到数据库的会话就不会因为大于5分钟的空闲时间而被中断。这种方案完全可以解决这个问题,但这种方法需要重新注册监听。

 

--简单做一个测试:

1.修改 sqlnet.ora文件,加入:

SQLNET.EXPIRE_TIME=1

重启监听。

2.远端打开连接数据库,不做任何操作。

3.在服务端执行如下命令:

# tcpdump -i eth0 -nnn host 192.168.xxx.xxx and port 1521

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode

listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes

11:13:11.436128 IP 192.168.yyy.yyy.1521 > 192.168.xxx.xxx.64247: P 2119621137:2119621147(10) ack 2682317414 win 16060

11:13:11.636552 IP 192.168.xxx.xxx.64247 > 192.168.yyy.yyy.1521: . ack 10 win 63492

11:14:11.437488 IP 192.168.yyy.yyy.1521 > 192.168.xxx.xxx.64247: P 10:20(10) ack 1 win 16060

11:14:11.637790 IP 192.168.xxx.xxx.64247 > 192.168.yyy.yyy.1521: . ack 20 win 63482

11:15:11.437914 IP 192.168.yyy.yyy.1521 > 192.168.xxx.xxx.64247: P 20:30(10) ack 1 win 16060

11:15:11.637900 IP 192.168.xxx.xxx.64247 > 192.168.yyy.yyy.1521: . ack 30 win 63472

11:16:11.438691 IP 192.168.yyy.yyy.1521 > 192.168.xxx.xxx.64247: P 30:40(10) ack 1 win 16060

11:16:11.637143 IP 192.168.xxx.xxx.64247 > 192.168.yyy.yyy.1521: . ack 40 win 63462

11:17:11.439824 IP 192.168.yyy.yyy.1521 > 192.168.xxx.xxx.64247: P 40:50(10) ack 1 win 16060

11:17:11.639376 IP 192.168.xxx.xxx.64247 > 192.168.yyy.yyy.1521: . ack 50 win 63452

11:18:11.441028 IP 192.168.yyy.yyy.1521 > 192.168.xxx.xxx.64247: P 50:60(10) ack 1 win 16060

11:18:11.640484 IP 192.168.xxx.xxx.64247 > 192.168.yyy.yyy.1521: . ack 60 win 63442

11:19:11.441949 IP 192.168.yyy.yyy.1521 > 192.168.xxx.xxx.64247: P 60:70(10) ack 1 win 16060

11:19:11.641719 IP 192.168.xxx.xxx.64247 > 192.168.yyy.yyy.1521: . ack 70 win 63432

 

--可以看到每隔1分钟,服务端向客户端发起连接,检测客户端是否存在。

 

下面再整合一个案例

DCD: Dead Connection Detection ,可以用于检测、标记僵死而没有断开会session,再由PMON进行清理,释放资源。开启DCD,只需要在服务端的sqlnet.ora文件中添加SQLNET.EXPIRE_TIME参数,单位为分钟。 如果时间达到这个值,server端就是发出一个”probe” packet 给客户端,如要客户断是正常的,这个packet就被忽略,timer重新计时;如果客户端异常中断,则server端就会收到一个消息,用以释放连接。

 

DCD还可以用于防止防火墙的timeout,例如:

某个系统RMAN备份,在结束时,这里是结束了,服务端和客户端不存在数据的交互,报如下信息:

released channel: dev_0

released channel: dev_1

released channel: dev_2

released channel: dev_3

released channel: dev_4

released channel: dev_5

released channel: dev_6

released channel: dev_7

released channel: dev_8

released channel: dev_9

released channel: dev_10

released channel: dev_11

RMAN-00571: ===========================================================

 

RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============

 

RMAN-00571: ===========================================================

 

RMAN-06004: ORACLE error from recovery catalog database:

ORA-03135: connection lost contact

ORACLE error from recovery catalog database:

ORA-03114: not connected to ORACLE

Is the rman catalog Database running on a different system than the Target Database?

If so, verify with the System Administrators what the TCP/IP timeout is set to.

If there is any firewall between two systems, set the value of SQLNET.EXPIRE_TIME to less than the TCP timeout value of the firewall.

Increase the value of SQLNET.EXPIRE_TIME in the sqlnet.ora file on both target servers if no firewall exists between two systems.

Increase the value of keepalive interval.

以上这个RMAN报错例子就是由于防火墙设置timeout原因,当client和server在timeout时间内没有数据传输的时候,会话就会被防火墙断开。而设置SQLNET.EXPIRE_TIME参数,使其小于防火墙的timeout时间,就可以避免这一情况的发生

 

——————————————————————————————

 

ORA-03135: connection lost contact.

 

——————————————————————————————

 

某B/S架构的应用程序在测试过程中每隔1到2小时出现“错误信息:ORA-03135: 连接失去联系的报错”,详细报错信息如下:

ORA-03135出现的原因较多,问题有可能出在网络设备、操作系统、数据库上,问题最有可能是由于网络闪段和防火墙配置所导致。

解决:经与网工确认,当前防火前未开启长连接设置,开启后问题解决。

补充一下长连接和短连接的概念:

①长连接的概念

长连接功能用于设置特定数据流的超长保持时间,让数据流的会话连接保持时间不受全局老化时间限制。其实这项特殊业务与目前业界的状态防火墙的实现机制是存在矛盾的。

为保证内部网络的安全,防火墙上的各会话缺省保持时间都相对较短,例如:缺省情况下,TCP的保持时间为1200s,UDP的保持时间为120s。

正常情况下,当一个TCP会话的两个连续报文到达防火墙的时间间隔大于该会话的保持时间时,为保证网络的安全性,防火墙将从会话表中删除相应会话信息。后续报文到达防火墙后,防火墙根据自身的转发机制,丢弃该报文,导致连接中断。在实际应用中,用户需要查询服务器上的数据,这些查询时间间隔远大于TCP/UDP默认的会话保持时间。此时需要在防火墙上保持TCP连接一段相对较长的时间。当某会话的报文长时间没有到达防火墙后再次到达时,仍然能够通过防火墙,这种技术就是长连接。

②短连接的概念

某些应用频繁发起连接,如果不缩短其会话保持时间,则会使防火墙的会话数爆涨,进而拖垮防火墙。保持太多的会话对防火墙没有必要,相反,当系统资源过多地用在会话保持的话,会相应损害每秒生成会话的能力,这是一个同样重要的性能指标。设定过高的会话数量,却降低了每秒生成会话的能力,其结果,只能是保留一些永远用不到的会话虚数而已。

因此,我们可以根据网络应用环境的实际需求,缩短某些会话的保持时间,从而减少防火墙的工作负荷,提高网络性能。

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值