Oracle定期请理INACTIVE会话

news/2025/1/24 11:17:44/文章来源:https://www.cnblogs.com/lndt/p/18689290

导语:生产系统在大升级之后(11g到19c)出现了一个问题,大量空闲会话不自己释放,会慢慢的到达session限制的值,导致数据库问题。
经过观察,这些空闲的会话都出自一个用户:AOX_USER。与应用系统的人联系,他们也查不出什么原因导致的。所以只能在数据库端处理。也就是定时对空闲的会话进行请理。

要求:

  1. 请理INACTIVE状态,并超过3小时的会话。清理语句参考:oracle killed session
  2. 将请理的会话信息收集到一个表中,作为凭据或者日志。

方法

清理的方法有两种:

  1. 用resource_limit的idle_time限制,在profile中设置。参考:用户管理之profile

    Oracle的idle限制机制优点是设置10分钟,空闲会话绝对不会活过11分钟。缺点是kill的会话信息不会存储。只能在alert日志中找到sid和serial number的信息。
  2. 用手动的alter system kill session语句,然后写存储过程定时执行。
    优点是手动的kill可以将准确的信息同时收集起来。缺点是因为是定时任务不会像idle限制一样那么的即时。

最后,领导觉得用第一种方法更好,只不过收集的会话信息可能会有重复的。

实现第一种方法

  1. 修改idletime参数
    首先查找
SYS@CSP> select username,profile from dba_users where username = 'AOX_USER';USERNAME	PROFILE
-------------
AOX_USER   AOXUSER_IDLESYS@CSP> select * from dba_profiles where PROFILE = 'AOXUSER_IDLE' and RESOURCE_NAME= 'IDLE_TIME';PROFILE  RESOURCE_NAME  RESOURCE   LIMIT COM INH IMP
---------------------------------------------------------
AOXUSER_IDLE IDLE_TIME  KERNEL     180 NO  NO  NO
--IDLE_TIME的值是180,单位是分钟,换算也就是3个小时--如果修改语句如下
ALTER PROFILE AOXUSER_IDLE LIMIT IDLE_TIME 180;
  1. 创建新表,用于存放会话信息,这个表的设计是因为我对v$session和v$sqlarea的sql语句
CREATE TABLE session_kill_log (SID NUMBER,SERIAL# NUMBER,USERNAME VARCHAR2(128),STATUS VARCHAR2(8),OSUSER VARCHAR2(128),MACHINE VARCHAR2(64),PROGRAM VARCHAR2(48),LOGON_TIME DATE,LAST_CALL_ET NUMBER,SQL_TEXT VARCHAR2(1000),CREATE_TIME    TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) TABLESPACE USERS;
  1. 添加job
BEGINDBMS_SCHEDULER.create_job(job_name        => 'INSERT_SESSION_SNAPSHOT_JOB', job_type        => 'PLSQL_BLOCK',                  job_action      => 'BEGININSERT INTO session_kill_log (SID, SERIAL#, USERNAME, STATUS, OSUSER, MACHINE, PROGRAM, LOGON_TIME, LAST_CALL_ET, SQL_TEXT)select sid,SERIAL#,a.username,a.STATUS,a.OSUSER,a.MACHINE,a.PROGRAM,a.LOGON_TIME,a.LAST_CALL_ET,b.SQL_TEXT from V$SESSION a join v$sqlarea b on a.PREV_SQL_ID=b.SQL_ID where a.status = ''INACTIVE''  and a.LAST_CALL_ET>10800;COMMIT;END;', start_date      => SYSTIMESTAMP,repeat_interval => 'FREQ=HOURLY; BYMINUTE=0;',enabled         => TRUE,comments        => 'Job to insert session snapshot every hour');
END;
/

说明:

  1. job每个小时执行一次.
  2. 任务是收集会话状信息的,条件是会话状态是INACTIVE,并且空闲时间超过3小时(60603=10800)
  3. 表session_kill_log最后一个字段是时间戳,代表插入的时间
  4. 插入的数据是v$session和v$sqlarea的复合查询,所以可以查到sql信息

关于job的调度请参考:调度任务(Job Scheduling)

实现第二种方法

  1. 创建新表,用于存放会话信息,这个表的设计是因为我对v$session和v$sqlarea的sql语句
CREATE TABLE session_kill_log (SID NUMBER,SERIAL# NUMBER,USERNAME VARCHAR2(128),STATUS VARCHAR2(8),OSUSER VARCHAR2(128),MACHINE VARCHAR2(64),PROGRAM VARCHAR2(48),LOGON_TIME DATE,LAST_CALL_ET NUMBER,SQL_TEXT VARCHAR2(1000),CREATE_TIME    TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) TABLESPACE USERS;
  1. 创建存储过程
CREATE OR REPLACE PROCEDURE pro_kill_sess_log ASCURSOR cut_sess ISselect sid,SERIAL#,a.username,a.STATUS,a.OSUSER,a.MACHINE,a.PROGRAM,a.LOGON_TIME,a.LAST_CALL_ET,b.SQL_TEXTfrom V$SESSION ajoin v$sqlarea bon a.PREV_SQL_ID=b.SQL_IDwhere a.status = 'INACTIVE' and a.LAST_CALL_ET>10800;   v_session_id NUMBER;v_serial_number NUMBER;v_username VARCHAR2(128);v_status VARCHAR2(8);v_osuser VARCHAR2(128);v_machine VARCHAR2(255);v_program VARCHAR2(48);v_logon_time DATE;v_last_call_et NUMBER;v_sql_text VARCHAR2(1000);	
BEGINFOR rec IN cut_sess LOOP-- 获取当前会话的信息v_session_id := rec.sid;v_serial_number := rec.serial#;v_username := rec.username;v_status := rec.status;v_osuser := rec.osuser;v_machine := rec.machine;v_program := rec.program;v_logon_time := rec.logon_time;v_last_call_et := rec.last_call_et;v_sql_text := rec.sql_text;-- 将会话信息插入日志表INSERT INTO session_kill_log (SID, SERIAL#, USERNAME, STATUS, OSUSER, MACHINE, PROGRAM, LOGON_TIME, LAST_CALL_ET, SQL_TEXT)VALUES (v_session_id, v_serial_number, v_username, v_status, v_osuser, v_machine, v_program, v_logon_time, v_last_call_et, v_sql_text);-- 执行 KILL 操作EXECUTE IMMEDIATE 'ALTER SYSTEM KILL SESSION ''' || v_session_id || ',' || v_serial_number || ''' IMMEDIATE';       -- 提交插入操作COMMIT;END LOOP;
EXCEPTIONWHEN OTHERS THEN-- 异常处理ROLLBACK;RAISE;
END pro_kill_sess_log;
/

说明:
(1). 用游标遍历我设计的sql查询语句,也就是空闲时间超过10800秒的会话。
(2). 循环遍历这些查到的信息,先将信息收集,再手动kill session

  1. 定时任务
BEGINDBMS_SCHEDULER.create_job (job_name        => 'JOB_KILL_SESSION',job_type        => 'PLSQL_BLOCK',job_action      => 'BEGIN pro_kill_sess_log; END;',start_date      => SYSTIMESTAMP,repeat_interval => 'FREQ=HOURLY; INTERVAL=1',  -- 每小时执行一次enabled         => TRUE);
END;
/

关于job的调度请参考:调度任务(Job Scheduling)

补充

ORACLE定期清理INACTIVE会话

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/874663.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何修改织梦网站的颜色?

要修改织梦网站的颜色,您可以通过以下几种方式实现:使用CSS样式:在织梦网站的CSS文件中,找到控制网站颜色的部分,并进行相应的修改。通常,这些样式位于网站的主题或模板目录下的CSS文件中。您可以使用文本编辑器(如Notepad++、Sublime Text等)打开CSS文件,并查找和修改…

如何修改网站数据库密码?

修改网站数据库密码是一项重要的安全措施,可以帮助保护您的网站数据。以下是一些基本的步骤:登录到数据库管理工具:使用数据库管理工具(如phpMyAdmin、MySQL Workbench等)登录到您的网站数据库。您需要知道数据库的主机名、用户名、密码和数据库名称。 选择要修改密码的用…

学习vue05补发一下昨天学习内容

学习了vue知识,关于vue工程的运行方式和程序,并学会了组合式和分组式API,主要是在其中不断查资料的学习关于vue运行,比如钩子函数,应用实例等等

WordPress移除页面源码head中style img:is的样式代码

上月中旬 WordPress 6.7 版本正式发布,随后很快又发布了 WordPress 6.7.1 维护版本,每次 WordPress 有大版本的更新子凡我都习惯先看看官方的更新记录,然后先升级泪雪博客看看有没有问题,最后再批量的升级其他项目的 WordPress 网站,然后就是还会习惯的看看前段代码是否存…

帝国cms网站名称修改不成功怎么办

如果您在帝国cms中修改网站名称不成功,可以尝试以下步骤:检查权限:确保您有足够的权限修改网站名称。通常,只有管理员或具有相应权限的用户才能进行此类修改。 清除缓存:修改网站名称后,可能需要清除缓存才能使更改生效。您可以在帝国cms后台找到“数据更新”或“缓存管理…

网站顶部logo在哪里修改

网站顶部logo的修改位置通常取决于您使用的网站建设工具或平台。以下是一些常见的修改方法:内容管理系统(CMS):如果您使用的是CMS,如WordPress、Drupal或Joomla,通常可以在后台管理界面中找到“外观”或“模板”选项,然后在其中找到“自定义”或“主题设置”等相关选项,…

网站PHP版本如何修改

网站的PHP版本是指网站所使用的PHP解释器的版本。修改网站的PHP版本可以通过以下步骤实现:确定服务器类型:首先需要确定网站所在的服务器类型,如Apache、Nginx等。不同的服务器类型有不同的PHP版本管理方式。 找到PHP版本管理工具:根据服务器类型,找到相应的PHP版本管理工…

分布式键值存储的王者--ETCD

在分布式系统的世界里,数据的一致性、可用性和分区容错性如同三座大山,横亘在开发者面前。 而 ETCD,犹如一位技艺高超的登山者,以其卓越的性能和稳定的表现,征服了这三座高峰,成为分布式键值存储领域当之无愧的王者。 ETCD 不仅仅是一个简单的键值存储系统,它更是分布式…

如何在CMS中修改网站的安装位置

问题描述:如何在CMS中修改网站的安装位置。 解决方法:确定CMS类型:不同的CMS可能有不同的方法来修改网站的安装位置。首先需要确定您使用的是哪种CMS,例如WordPress、Drupal、Joomla等。 备份网站数据:在进行任何修改之前,务必备份网站的所有数据,包括数据库和文件。这是…

WebStorm2024如何安装?附安装包和激活方式

前言 大家好,我是小徐啊。WebStorm是我们常用的开发web应用的开发工具,其功能十分强大。今天,小徐就来介绍下如何安装和激活webstorm。文末附获取方式。 如何安装和激活WebStorm 首先,我们打开安装包,双击下,点击运行按钮。然后,我们点击下一步按钮。然后,我们选择要安…

IDEA如何将一行上移或者下移

前言 大家好,我是小徐啊。我们在使用IDEA开发Java应用的时候,都会使用到IDEA的快捷键。这些快捷键帮助我们提高了开发的效率。今天,我要介绍下,在IDEA中如何将某一行代码上移或者下移。这个技巧在我们编写代码的时候还是很有效的。 如何下移一行代码 首先,我们需要打开IDE…

NFS动态存储实战案例

NFS动态存储实战案例Kubernetes 不包含内部 NFS 驱动。你需要使用外部驱动为 NFS 创建 StorageClass。卷插件 内置配置器 配置示例AzureFile ✓ Azure FileCephFS - -FC - -FlexVolume - -iSCSI - -Local - LocalNFS - NFSPortworxVolume ✓ Portworx VolumeRBD ✓ Ceph RBDVsp…