Oracle之关于各类连接超时相关参数学习

最近遇到些空闲连接超时相关的问题,查了下主要有以下与超时相关参数,整理记录含义及区别。

  • EXPIRE_TIME
  • IDLE_TIMEOUT
  • SESSION_TIMEOUT
  • INBOUND_CONNECT_TIMEOUT
  • profile中的idle_time
  • profile中的connect_time

一、 EXPIRE_TIME

1. 使用说明

EXPIRE_TIME 用于死连接检测。设定该参数为非零值,12c前会定期给空闲连接发送探测包检查客户端是否已异常断开(12c开始则利用操作系统keepalive参数进行检测)。

一旦发现异常连接,最多会重传操作系统参数tcp_retries2指定次数。

如果超过最大重试次数仍重传失败,将返回错误并通知oracle pmon进程清除对应的server process。

值得注意的是,根据文档 Doc ID 395505.1,如果在1个SQLNET.EXPIRE_TIME之内客户端有数据包发送,在SQLNET.EXPIRE_TIME时间到来时,oracle不会再发送探测数据包给客户端,这样有可能出现最大2*SQLNET.EXPIRE_TIME时间端内,没有发送探测包给客户端的情况。

比如设置sqlnet.expire_time=10,最大空闲时间则可能为2*600=1200秒,如果防火墙空闲超时为910秒,完全可能出现在探测包发送之前,空闲连接就已经被断开的情况。

2. 使用限制

新设置参数对旧连接上不生效(It is not allowed on bequeathed connections.)

探测数据包虽然很小,却也会产生额外的流量,可能降低网络性能

根据操作系统不同,服务器可能需要执行其他处理,以区分连接探测事件和其他事件,这也会导致网络性能下降。

二、 IDLE_TIMEOUT

空闲超时时间。指定已建立的连接在不传输数据的情况下可以保持活动状态的时间。

Oracle默认情况下不会关闭非活跃连接(IDLE_TIMEOUT=0),但非活跃连接过长时间不退出可能导致连接数过高,浪费数据库资源。

将IDLE_TIMEOUT设置为大于0的值(单位为秒)指定会话空闲超时时间,到达超时时间后会话会被数据库中断。

通常防火墙会有kill空闲连接的配置,可以看看是否有必要重复设置。如果要设,IDLE_TIMEOUT指定的时间应该小于防火墙指定的空闲时间。

EXPIRE_TIME 与 IDLE_TIMEOUT的区别:

  • EXPIRE_TIME检查的是客户端由于各种原因已经异常中断的会话,虽然v$session视图看到处于inactive状态,但其实该连接已经僵死,不会再有数据请求。
  • IDLE_TIMEOUT检查的是处于inactive状态超过指定时间的会话,即使客户端正常连接,到达超时时间后也会将其中断。

三、 SESSION_TIMEOUT

指定用户会话允许的最长时间(以秒为单位)。很明显这个参数要更进一步,无论用户会话是不是空闲,到了SESSION_TIMEOUT指定就会被中断。

默认值为0,表示禁用该功能。

四、 INBOUND_CONNECT_TIMEOUT

表示等待用户认证超时的时间。单位是秒,默认60秒,如果客户端在指定的时间内没有连接上数据库(例如用户认证超时),会在listener.log中会出现 TNS-12535: TNS:operation timed out,在alert日志中记录 WARNING: inbound connection timed out (ORA-3136) 和 TNS-12535。

另外在listener.ora中也有一个INBOUND_CONNECT_TIMEOUT参数,名为:inbound_connect_timeout_监听器名。

如果建立监听后在设置的时间内没有反应将会断开连接,单位是秒,默认60秒。

如果连接请求超时,listener.log中会出现 TNS-12525: TNS:listener has not received client's request in time allowed。

关于两者之间的关系,官方文档建议INBOUND_CONNECT_TIMEOUT_listener_name的值低于SQLNET.INBOUND_CONNECT_TIMEOUT。

Set both parameters to an initial low value.

Set the value of the INBOUND_CONNECT_TIMEOUT_listener_name parameter to a lower value than the SQLNET.INBOUND_CONNECT_TIMEOUT parameter.

For example, you can set INBOUND_CONNECT_TIMEOUT_listener_name to 2 seconds and INBOUND_CONNECT_TIMEOUT parameter to 3 seconds. If clients are unable to complete connections within the specified time due to system or network delays that are normal for the particular environment, then increment the time as needed.

前面几个参数都是系统级的,下面来看可以在用户级指定的超时参数。

五、 profile中的idle_time

用户级的空闲超时时间。单位是分钟,默认是UNLIMITED,连接始终不会被断开,这就占用了连接数资源。

配置步骤如下,注意设置后对已经连上的会话不生效,对新连上的会话才生效。

-- 查找用户所属的profile,例如叫APP_USER
select username, b.*
from dba_users a, dba_profiles b
where a.profile = b.profile and username='USERNAME';
 
-- 更改该profile的idle_time
alter profile app_user limit idle_time 30;
 
-- 使修改的资源生效,需要设置resource_limit设置为true
alter system set resource_limit=true;

如果用户空闲超过指定时间,会报错ORA-02396:exceeded maximum idle time, please connect again

六、 profile中的connect_time

用户级的会话超时时间(类似前面SESSION_TIMEOUT),单位是分钟,默认是UNLIMITED。

用户会话在到达设置的时候后不能再继续操作(无论期间是不是空闲)。

设置方法跟前面类似

-- 查找用户所属的profile,例如叫APP_USER
select username, b.*
from dba_users a, dba_profiles b
where a.profile = b.profile and username='USERNAME';
 
-- 更改该profile的connect_time
alter profile app_user limit connect_time 30;
 
-- 使修改的资源生效,需要设置resource_limit设置为true
alter system set resource_limit=true;

如果是设置1分钟,会在将近2分钟的时候提醒你重新登录,ORA-02399: exceeded maximum connect time, you are being logged off。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

你可能感兴趣的:(Oracle之关于各类连接超时相关参数学习)