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

 更新时间:2023年04月12日 15:07:55   作者:Hehuyi_In  
这篇文章主要介绍了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如何设置表空间数据文件大小

    Oracle如何设置表空间数据文件大小

    这篇文章主要介绍了Oracle如何设置表空间数据文件大小,文中讲解非常细致,帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-07-07
  • Oracle数据库自定义类型type的用法详解

    Oracle数据库自定义类型type的用法详解

    这篇文章主要介绍了Oracle数据库自定义类型type的用法详解,Oracle 数据库的概念和其它数据库不一样,这里的数据库是一个操作系统只有一个库,可以看作是 Oracle 就只有一个大数据库,需要的朋友可以参考下
    2023-07-07
  • Weblogic控制台修改用户密码的教程分享

    Weblogic控制台修改用户密码的教程分享

    这篇文章主要为大家详细介绍了Weblogic控制台修改用户密码的方法,文中通过图片进行了详细的讲解,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-08-08
  • oracle逻辑运算符与其优先级简介

    oracle逻辑运算符与其优先级简介

    这篇文章主要介绍了oracle逻辑运算符与其优先级的相关内容,涉及一些代码示例,具有一定参考价值。若有不当之处,欢迎指出。
    2017-09-09
  • oracle10g发送email示例

    oracle10g发送email示例

    本文介绍了通过Oracle10g发送Email的实例,该Procedure支持中文邮件、HTML代码、多收件人。 ,需要的朋友可以参考下
    2014-01-01
  • Oracle中手动删除数据库教程

    Oracle中手动删除数据库教程

    这篇文章主要介绍了Oracle中手动删除数据库教程,本文给出了详细步骤以及清除ASM数据库的步骤,需要的朋友可以参考下
    2014-10-10
  • Oracle to_char 日期转换字符串语句分享

    Oracle to_char 日期转换字符串语句分享

    这篇文章主要介绍了Oracle to_char 日期转换字符串语句,别处挖过来的,真是太长了,学习oracle的朋友可以收藏下
    2014-08-08
  • 麒麟V10更换OpenJDK为Oracle JDK的方法

    麒麟V10更换OpenJDK为Oracle JDK的方法

    这篇文章主要介绍了麒麟V10更换OpenJDK为Oracle JDK,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • 直接拷贝数据文件实现Oracle数据迁移

    直接拷贝数据文件实现Oracle数据迁移

    Oracle 数据迁移是比较麻烦的,对菜鸟来说更是如此。最近由于更换服务器,需要将Oracle迁移到另外一台机器,在两个服务器环境相同,以及 Oracle版本相同的前提下,通过直接拷贝数据文件到新服务器,就可以直接迁移成功。这里记录一下迁移步骤。需要的朋友可以参考。
    2017-01-01
  • Oracle中的table()函数使用

    Oracle中的table()函数使用

    这篇文章主要介绍了Oracle中的table()函数的使用,提高查询效率,利用table()函数,可接收输入参数,然后将pl/sql 返回的结果集代替table,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2023-05-05

最新评论