扫码加入

  • 正文
  • 相关推荐
申请入驻 产业图谱

DM清理kill大于10s的select会话语句

01/16 08:36
265
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论
使用过程定期清理kill大于10s的select会话语句,以免阻塞其它会话,供参考

/******************************************
功能说明:定期清理kill大于10s的select会话语句,以免阻塞其它会话
CREATE TABLE "KILL_STL_SESS_BAK"
(
"TF" VARCHAR2(39),
"SESS_ID" BIGINT,
"TRX_ID" BIGINT,
"MSGT" INTEGER,
"SQL_TEXT" VARCHAR2(32767),
"CURR_SCH" VARCHAR(128),
"USER_NAME" VARCHAR(128),
"CLNT_HOST" VARCHAR(128),
"CLNT_IP" VARCHAR(128),
"CLNT_TYPE" VARCHAR(128),
"OSNAME" VARCHAR(128),
"LAST_SEND_TIME" VARCHAR2(32767),
"RECORDING_TIME" TIMESTAMP
);

create or replace procedure dm_dba_close_slt_session 
    AUTHID DEFINER
as
begin
    for rs in( select 'sp_close_session('||TF||');' as "op_sql",
            "SESS_ID",
            "TRX_ID" ,
            "MSGT" ,
            "SQL_TEXT" ,
            "CURR_SCH" ,
            "USER_NAME",
            "CLNT_HOST" ,
            "CLNT_IP" ,
            "CLNT_TYPE" ,
            "OSNAME" ,
            "LAST_SEND_TIME",
            getdate() as "RECORDING_TIME"
       from ( select sess_id tf,-- sp_close_session sess_id                                   ,
                    sess_id ,
                    trx_Id ,
                    datediff(ss, last_recv_time, sysdate) MsgT,                             --已执行时间 s
                    '--'||CURR_SCH ||' '|| to_char(sf_get_session_sql(sess_id)) "SQL_TEXT" ,--完整sql
                    curr_sch ,
                    user_name ,
                    clnt_host ,
                    clnt_ip ,
                    clnt_type ,
                    osname ,
                    left(last_send_time, 19) as last_send_time
               from v$sessions
              where state='ACTIVE'
                    -- 过滤update类型的SQL
                and lower (to_char(sf_get_session_sql(sess_id))) like 'select %' )
      where MsgT>=10 )  --MsgT 单位秒,查询大于10s的select会话语句;
    loop
        execute immediate rs."op_sql";
        insert into "KILL_SESS_BAK" values(rs."op_sql", 
               rs."SESS_ID", 
               rs."TRX_ID", 
               rs."MSGT", 
               rs."SQL_TEXT", 
               rs."CURR_SCH", 
               rs."USER_NAME", 
               rs."CLNT_HOST",
               rs."CLNT_IP", 
               rs."CLNT_TYPE", 
               rs."OSNAME", 
               rs."LAST_SEND_TIME", 
               rs."RECORDING_TIME");
         
        commit;
    end loop;
end;
/ --disql执行需要加/

--执行语句kill会话
dm_dba_close_slt_session;


查询备份表结果示例:

select * from KILL_SESS_BAK;

在这里插入图片描述

相关推荐