Oracle 概要文件IDLE_TIME限制用户最大空闲连接时间

本文介绍如何通过设置Oracle数据库中的资源限制和配置文件(profile),来管理会话的空闲时间,防止资源被长期占用。文中详细解释了如何启用资源限制、修改默认配置文件中的空闲时间限制,并介绍了如何通过SQLNET.EXPIRE_TIME参数清理异常断开的连接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

会话的状态: 
1.active 处于此状态的会话,表示正在执行,处于活动状态。 
2.killed 处于此状态的会话,表示出现了错误,正在回滚,当然,也是占用系统资源的。还有一点就是,killed的状态一般会持续较长时间,而且用windows下的工具pl/sql developer来kill掉,是不管用的,要用命令:alter system kill session 'sid,serial#' ; 
3.inactive 处于此状态的会话表示不是正在执行的,比如select语句已经完成。我一开始以为,只要是inactive状态的会话,就是该杀,为什么不释放呢。其实,inactive对数据库本身没有什么影响,但是如果程序没有及时commit,那么就会造成占用过多会话。解决inactive的方法最好的就是在oracle中直接设置超时时间。

 

下面是解决的方法:

Oracle会话达到一定连接时间自动断开的方法

IDLE_TIME:限制每个会话所允许的最长连续空闲时间,超过这个时间会话将自动断开。参数值是一个整数,单位是分钟。

1.Oracle数据库当中至少会有一个Profie文件,它可以限制口令和资源。建立oracle数据库时候,oracle会自动建立命名为default的profile,初始化的default有默认值,下面可以查看默认的profile的资源和口令限制的详细信息。

SQL> select PROFILE,RESOURCE_NAME,LIMIT from dba_profiles where PROFILE='DEFAULT';   

 

PROFILE      RESOURCE_NAME   LIMIT

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

DEFAULT      COMPOSITE_LIMIT   UNLIMITED

DEFAULT      SESSIONS_PER_USER   UNLIMITED

DEFAULT      CPU_PER_SESSION       UNLIMITED

DEFAULT      CPU_PER_CALL           UNLIMITED

DEFAULT      LOGICAL_READS_PER_SESSION     UNLIMITED

   

 

DEFAULT      LOGICAL_READS_PER_CALL  UNLIMITED

     

 

DEFAULT      IDLE_TIME   UNLIMITED

这个是空闲时间用来限制用户连接时间

 

PROFILE      RESOURCE_NAME   LIMIT

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

DEFAULT      CONNECT_TIME     UNLIMITED

DEFAULT      PRIVATE_SGA     UNLIMITED

DEFAULT      FAILED_LOGIN_ATTEMPTS  10

     

 

DEFAULT      PASSWORD_LIFE_TIME   180

DEFAULT      PASSWORD_REUSE_TIME  UNLIMITED

DEFAULT      PASSWORD_REUSE_MAX   UNLIMITED

DEFAULT      PASSWORD_VERIFY_FUNC NULL

     TION

 

 

PROFILE      RESOURCE_NAME   LIMIT

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

DEFAULT      PASSWORD_LOCK_TIME   1

DEFAULT      PASSWORD_GRACE_TIME  7

 

16 rows selected.

 

 

查看某个用户的使用的profile文件,这个通过dba_users来查看。

SQL> select username,profile from dba_users where username='SYSTEM';

 

USERNAME      PROFILE

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

SYSTEM      DEFAULT

 

2.Oracle的系统参数RESOURCE_LIMIT是一个用来监控用户对于数据库资源使用的参数,当值为true的时候即为启用,否则禁用(默认是禁用的)。该参数结合profile来控制多种资源的使用,如CPU_PER_SESSION,CONNECT_TIME等等,从而达到节省资源来实现高效性能。通过下面语句可以在RAC当中查看系统参数RESOURCE_LIMIT是否开启。

SQL> select name,value from gv$parameter where name='resource_limit';

NAME              VALUE

resource_limit    FALSE

 

3.首先开启这个参数

SQL> alter system set resource_limit=true;

 

System altered.

 

SQL> select name,value from gv$parameter where name='resource_limit';

 

NAME              VALUE

resource_limit     TRUE

 

4.修改profile的idle_time,单位为分钟。设置为一小时60分钟。

SQL> alter profile default limit idle_time 60;

Profile altered.

之后再查看一下

SQL> select PROFILE,RESOURCE_NAME,LIMIT from dba_profiles where RESOURCE_NAME='IDLE_TIME';

PROFILE      RESOURCE_NAME   LIMIT

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

DEFAULT      IDLE_TIME   60

 

说明:

A:参数RESOURCE_LIMIT=TRUE用于启用数据库资源限制;

B:PROFILE用于实现资源的配置,创建或者修改已存在的PROFILE来调整各个具体资源的配置

C:一旦被限制的用户超出所设定的阀值将收到资源配置相关的错误提示

D:被限制资源的状态变为sniped

E:被限制资源的session对应的server process并没有释放,需要结合sqlnet.expire_time来释放。

  通过idle_time限制session idle 时间。session idle超过设置时间,状态为sniped (v$session).,然而OS下的process并不会释放,当session(user process) 再次与server process 通讯,将关闭相应的server process.

 

5.使用SQLNET__EXPIRE_TIME清楚僵死的连接:

   数据库连接的客户端异常断开后,其占有的资源并没有被释放,从v$session数视图中依旧可以看到对应的session处于inactive状态,且对应的服务器进程也没有释放,导致资源长时间被占有。SQLNET.EXPIRE_TIME专门用于清理那些异常断开的情况:通过设定参数为非0值(单位为分钟)来发送探测包以检查客户端异常断开。一旦探测包找到了异常连接将返回错误,清楚对应的server process。

配置SQLNET.EXPIRE_TIME:对于SQLNET.EXPIRE_TIME的配置,需要修改sqlnet.ora,其路径为$ORACLE_HOME/network/admin下面。然后添加SQLNET.EXPIRE_TIME选项,之后重启监听。

 

6.总结:

A:INACTIVE SESSION 是用户建立连接之后,尚未执行任何操作或操作已经完成但没有断开,等同于与处于idle状态,在v$session视图呈现的是INACTIVE状态。

B:对于使用resource_limit以及profile配置后用户session超出idle_time的情形,在v$sessin视图呈现sniped状态

C:当在sqlnet.ora配置文件中设置SQLNET.EXPIRE_TIME参数为非领值时,僵死连接在EXPIRE_TIME制定时间后被清楚(设定24小时后将INACTIVE状态的session置为SNPIED状态,之后再半小时后清除僵死连接,理论上是行得通的)

D:设定SQLNET.EXPIRE_TIME为非零值之后,系统需要产生额外的开销以及带来网络性能的下降。

E:对于需要及时释放OS以及DB资源的情形,Oracle建议使用resource_limit以及profile限制的用户连接同时并设定SQLNET.EXPIRE_TIME为非零值。

 

 

### 查看、设置或限制Oracle数据库用户会话时间 #### 查看当前用户的会话持续时间 为了获取有关特定会话的信息,可以查询`V$SESSION`视图来查找关于活动连接的数据。通过计算自登录以来经过的时间,能够间接得知会话已经存在多久。 ```sql SELECT username, sid, serial#, logon_time, ROUND((SYSDATE - logon_time) * 24 * 60, 2) AS minutes_connected FROM v$session; ``` 此SQL语句返回每个活跃会话及其对应的用户名、SID(会话ID)、序列号以及从登录到现在所花费的大致分钟数[^1]。 #### 设置默认会话超时 对于希望设定整个实例级别的参数以控制不活跃会话自动断开的行为,可以通过调整初始化参数文件中的`RESOURCE_LIMIT`和`IDLE_TIME`实现这一目标: - `RESOURCE_LIMIT`: 启用资源管理器功能,默认情况下该选项可能被禁用。 - `IDLE_TIME`: 定义当一个会话处于闲置状态超过指定数量分钟后将被终止;单位为分钟。 执行如下命令启用并配置这些参数: ```sql ALTER SYSTEM SET RESOURCE_LIMIT=TRUE SCOPE=BOTH; ALTER PROFILE DEFAULT LIMIT IDLE_TIME 30; -- 将空闲时间设为30分钟 ``` 上述更改仅影响新创建的会话,在现有会话上不会立即生效[^2]。 #### 对单个用户应用不同的策略 如果需要针对不同用户提供差异化的处理方式,则应该考虑利用概要文件(`PROFILE`)机制来进行更细粒度的权限管理和行为约束。例如,为某位用户分配专门定制好的个人资料(profile),其中包含了特殊的IDLE_TIME值或其他限制条件。 创建一个新的profile并将它指派给某个具体的账户作为其默认属性集的方法如下所示: ```sql CREATE PROFILE short_idle_profile LIMIT IDLE_TIME 5; ALTER USER scott PROFILE short_idle_profile; ``` 这使得名为SCOTT的用户在其任何一次新的登录尝试中都将遵循这个较短的空闲时限规定——即五分钟后如果没有进一步操作就会被迫下线[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值