Oracle数据库第三种会话超时管理的办法是在用户的profile文件中设置超时管理,这种方法有一个其它两种办法没有的好处是可以针对每个用户设置单独的超时参数,具有更好的灵活性。
1 用户profile文件
创建用户时可以为用户指定一个profile文件,在profile文件里可以设置用户的密码策略和资源限制等,其中就包括会话的空闲超时和会话的连接时间限制。通常我们在创建用户时不会指定profile文件,这是用户适用的就是数据库默认的profile文件,名字就叫做DEFAULT。
profile的资源限制是否生效由一个实例参数决定,这个实例参数的名字是resource_limit,这个参数的默认值如下:
SQL>select NAME,VALUE,DEFAULT_VALUE,ISSYS_MODIFIABLE, DESCRIPTION from v$parameter where name='resource_limit';NAME VALUE DEFAULT_VALUE ISSYS_MOD DESCRIPTION ---------------- ----- -------------- --------- ----------------------------------------resource_limit TRUETRUE IMMEDIATE master switch for resource limit
可以看到这个参数的默认值是true,更改后可以立即生效。这个参数的设置对用户的资源限制和会话管理有影响,对用户的密码策略则没有影响,无论这个参数的值是什么,用户的密码策略总是生效的。
需要考虑的另一点时,在启用用户的profile资源限制时,会对数据库的性能造成轻微的影响,这是因为在每一次连接数据库时,Oracle都要载入profile文件,执行资源策略。
2 在profile文件中执行会话空闲和连接时间限制
在用户的profile文件中,可以设置会话的空闲超时时间。如果会话跳用之间的空闲时间超过设置时间,会话当前的事务会被回滚,会话被终结,会话占用的资源也会被释放。会话的下一个调用会收到指示它不再连接到实例的错误。这里面要注意的是,在会话空闲超时之后,Oracle的pmon后台进程会执行会话清除工作,在pmon进程完成会话清除之前,进程任然会被显示为活跃进程,并且仍然被计算到会话和用户资源限制之内。
在用户的profile文件中,也可以设置会话的连接时间限制,如果会话的连接时间超过了限制时间,会话的当前事务被回滚,会话被丢弃,资源占用资源被释放。
上面的这两个参数的单位都是分钟,有一点需要注意的是,这两个时间都不是精确的,Oracle不会持续监测会话的空闲时间或者是连接时间,不这么做的原因是为了节省资源,以免对性能造成过大的影响。Oracle的做法是每个几分钟进行检查,因此,会话可能会稍微超过一点设置的时间才会被判为超时,这个超过的时间有可能是几分钟。看一下数据库中这两个参数的默认设置:
SQL>select PROFILE,RESOURCE_NAME,LIMITfrom dba_profiles where PROFILE='DEFAULT'and RESOURCE_NAME in('IDLE_TIME','CONNECT_TIME')PROFILE RESOURCE_NAME LIMIT-------------------------------- -------------------------------- --------------------------------DEFAULT IDLE_TIME UNLIMITED DEFAULT CONNECT_TIME UNLIMITED
在数据库默认的DEFAULT profile文件中,这两个参数的默认值都是unlimited,即没有限制。
3 实验验证
先验证一下空闲超时设置,直接更改DEFAULT profile文件中的这个参数值,在profile文件里更改的值只对更改之后的新建的会话有效,对已经登录的会话是无效的。
SQL>alter profile DEFAULT limit IDLE_TIME 3;Profile altered.
更改之后新建一个会话,不执行任何操作,大约3分钟后会话,会话被终结,数据库告警日志里出现了下面的信息。
2023-02-17T15:00:12.939943+08:00KILL SESSION for sid=(110,33842): Reason = profile limit idle_time Mode = KILL SOFT -/-/NO_REPLAY Requestor = PMON (orapid =2, ospid =1672, inst =1) Owner = Process: USER (orapid =47, ospid =3895) Result = ORA-0
告警日志里显示被终结会话的sid和serial#,会话被kill的原因,请求kill这个会话的进程是pmon。
验证完之后恢复DEFAULT profile 中这个文件的默认设置
alter profile DEFAULT limit IDLE_TIME unlimited;
验证连接超时设置使用单独的profile,为用户创建一个单独的profile,设置会话连接超时时间,先创建一个profile文件
SQL>create profile test_connect limit CONNECT_TIME 3; Profile created.
创建用户profile时至少要指定一个参数,其它的参数会采用默认值,如下面看到的
SQL>select PROFILE,RESOURCE_NAME,LIMITfrom dba_profiles where PROFILE='TEST_CONNECT';PROFILE RESOURCE_NAME LIMIT-------------------- -------------------------------- --------------------TEST_CONNECT COMPOSITE_LIMIT DEFAULT TEST_CONNECT SESSIONS_PER_USER DEFAULT TEST_CONNECT CPU_PER_SESSION DEFAULT TEST_CONNECT CPU_PER_CALL DEFAULT TEST_CONNECT LOGICAL_READS_PER_SESSION DEFAULT TEST_CONNECT LOGICAL_READS_PER_CALL DEFAULT TEST_CONNECT IDLE_TIME DEFAULT TEST_CONNECT CONNECT_TIME 3TEST_CONNECT PRIVATE_SGA DEFAULT TEST_CONNECT FAILED_LOGIN_ATTEMPTS DEFAULT TEST_CONNECT PASSWORD_LIFE_TIME DEFAULT TEST_CONNECT PASSWORD_REUSE_TIME DEFAULT TEST_CONNECT PASSWORD_REUSE_MAX DEFAULT TEST_CONNECT PASSWORD_VERIFY_FUNCTION DEFAULT TEST_CONNECT PASSWORD_LOCK_TIME DEFAULT TEST_CONNECT PASSWORD_GRACE_TIME DEFAULT TEST_CONNECT INACTIVE_ACCOUNT_TIME DEFAULT
设置测试用户的profile为这个文件
SQL>alter user test profile test_connect;User altered.
开启一个会话
SQL>/SYSDATE -------------------2023-02-1715:13:02SQL>/SYSDATE -------------------2023-02-1715:13:04SQL>/select sysdate from dual *ERROR at line 1:ORA-02399: exceeded maximum connect time, you are being logged off
会话超时后,显示的是超过最大连接时间,会话被注销。