oracle-session-kill_block_session存储过程创建及使用

简介:

kill_block_session存储过程创建及使用


1.使用方法

1. 传表名,把访问table的session都kill掉

    exec KILL_BLOCK_SESSION('table');

2. 传job_id,把job相关的session都kill掉

    exec KILL_BLOCK_SESSION(102);

3. 传event_id把等待某event相关的session都kill掉

    exec KILL_BLOCK_SESSION(10);


2.例子:-kill掉job进程


job告警

    : 告警 OracleJobBroken
    告警对象: 192.168.10.11:1521
    告警详情: Oracle job 392 broken  
    应用归属: 
    备注信息: 报表数据库
    DBA   : 
    触发时间: 
    处理方法: 

查看job信息

select job,log_user,schema_user,last_date,last_sec,next_date,next_sec,total_time,broken,interval,failures,what from dba_jobs order by failures desc;

查看job runing

select * from dba_jobs_running;


       SID        JOB   FAILURES LAST_DATE LAST_SEC                         THIS_DATE THIS_SEC                           INSTANCE
---------- ---------- ---------- --------- -------------------------------- --------- -------------------------------- ----------
      1152        392       5509 09-10月-21 09:00:01                         21-10月-21 08:25:17                                  0

已选择 3 行。

kill running job

exec sys.kill_block_session(392)

3.kill_block_session存储创建脚本

----在sys用户下创建kill_block_session

CREATE OR REPLACE PROCEDURE SYS.kill_block_session(p_obj   IN VARCHAR2 DEFAULT NULL,
                                               p_job   IN NUMBER DEFAULT NULL,
                                               p_event IN NUMBER DEFAULT NULL) AS
BEGIN
  IF p_obj IS NOT NULL
     AND p_job IS NULL
     AND p_event IS NULL
  THEN
    FOR c IN (SELECT /*+ rule */
              DISTINCT s.username,
                       s.inst_id,
                       s.sid,
                       s.serial#
                FROM gv$session s,
                     gv$access  a
               WHERE s.inst_id = a.inst_id
                 AND s.sid = a.sid
                 AND a.object = upper(p_obj))
    LOOP
      IF c.username IS NOT NULL
         AND c.username NOT IN ('SYS',
                                'SYSTEM')
      THEN
        dbms_output.put_line('alter system kill session ''' || c.sid || ',' ||
                             c.serial# || ',@' || c.inst_id ||
                             ''' immediate');
        EXECUTE IMMEDIATE 'alter system kill session ''' || c.sid || ',' ||
                          c.serial# || ',@' || c.inst_id || ''' immediate';
      ELSE
        raise_application_error(-20000,
                                'Attempting to kill protected system session has been blocked.');
      END IF;
    END LOOP;
  ELSIF p_obj IS NULL
        AND p_job IS NOT NULL
        AND p_event IS NULL
  THEN
    FOR c IN (SELECT /*+ rule */
              DISTINCT s.username,
                       s.inst_id,
                       s.sid,
                       s.serial#
                FROM gv$session s
               WHERE sid IN (SELECT sid
                               FROM dba_jobs_running
                              WHERE job = p_job))
    LOOP
      IF c.username IS NOT NULL
         AND c.username NOT IN ('SYS',
                                'SYSTEM')
      THEN
        dbms_output.put_line('alter system kill session ''' || c.sid || ',' ||
                             c.serial# || ',@' || c.inst_id ||
                             ''' immediate');
        EXECUTE IMMEDIATE 'alter system kill session ''' || c.sid || ',' ||
                          c.serial# || ',@' || c.inst_id || ''' immediate';
      ELSE
        raise_application_error(-20000,
                                'Attempting to kill protected system session has been blocked.');
      END IF;
    END LOOP;
  ELSIF p_obj IS NULL
        AND p_job IS NULL
        AND p_event IS NOT NULL
  THEN
    FOR c IN (SELECT /*+ rule */
              DISTINCT s.username,
                       s.inst_id,
                       s.sid,
                       s.serial#
                FROM gv$session s
               WHERE status = 'INACTIVE'
                 AND event# = to_number(p_event))
    LOOP
      IF c.username IS NOT NULL
         AND c.username NOT IN ('SYS',
                                'SYSTEM')
      THEN
        dbms_output.put_line('alter system kill session ''' || c.sid || ',' ||
                             c.serial# || ',@' || c.inst_id ||
                             ''' immediate');
        EXECUTE IMMEDIATE 'alter system kill session ''' || c.sid || ',' ||
                          c.serial# || ',@' || c.inst_id || ''' immediate';
      ELSE
        raise_application_error(-20000,
                                'Attempting to kill protected system session has been blocked.');
      END IF;
    END LOOP;
  ELSE
    raise_application_error(-30000,
                            'Wrong number or types of arguments in call to ''kill_block_session''.');
  END IF;
END;
/

----给用户创建同义词

CREATE OR REPLACE SYNONYM VSKYADMIN.KILL_BLOCK_SESSION FOR SYS.KILL_BLOCK_SESSION;

----把执行存储过程权限授予用户

GRANT EXECUTE ON SYS.KILL_BLOCK_SESSION TO VSKYADMIN;
目录
相关文章
|
6月前
|
存储 SQL Oracle
Oracle系列十五:存储过程
Oracle系列十五:存储过程
|
2天前
|
存储 Oracle 关系型数据库
oracle服务器存储过程中调用http
通过配置权限、创建和调用存储过程,您可以在Oracle数据库中使用UTL_HTTP包发起HTTP请求。这使得Oracle存储过程可以与外部HTTP服务进行交互,从而实现更复杂的数据处理和集成。在实际应用中,根据具体需求调整请求类型和错误处理逻辑,以确保系统的稳定性和可靠性。
7 0
|
6月前
|
SQL 存储 Oracle
一篇文章带你学会 Oracle 存储过程的基本介绍和高阶用法(上)
一篇文章带你学会 Oracle 存储过程的基本介绍和高阶用法
|
6月前
|
存储 Java 数据库
JAVAEE框架数据库技术之13_oracle 之PLSQL技术及存储过程和函数(二)
JAVAEE框架数据库技术之13_oracle 之PLSQL技术及存储过程和函数
75 0
|
5月前
|
存储 SQL Oracle
oracle 存储过程导出sql语句 导出为文件
oracle 存储过程导出sql语句 导出为文件
181 0
|
6月前
|
SQL 存储 Oracle
一篇文章带你学会 Oracle 存储过程的基本介绍和高阶用法(下)
一篇文章带你学会 Oracle 存储过程的基本介绍和高阶用法
|
6月前
|
存储 SQL Oracle
Oracle存储过程与自定义函数的调用:异同与实战场景
【4月更文挑战第19天】Oracle的存储过程与自定义函数各有特色,存储过程用于封装复杂SQL操作,常在批量处理和数据维护中使用,通过CALL或EXECUTE调用;而自定义函数则用于简单计算和查询,返回单一值,可直接在SQL语句中调用。了解两者异同,如返回值方式、调用方式和应用场景,能提升数据库管理效率。实战场景包括:使用存储过程定期清理过期数据,用自定义函数在查询中动态计算字段值。
|
6月前
|
存储 SQL Oracle
Oracle存储过程:数据王国的魔法师
【4月更文挑战第19天】Oracle存储过程是封装复杂SQL操作的魔法工具,存储在数据库中以便重复调用。它们提供高效执行和安全,类似于预编译的程序。创建存储过程涉及定义名称和参数,如示例所示,创建一个根据员工ID获取姓名和薪资的`get_employee_info`过程。调用存储过程可提高代码可读性和性能,使数据库管理更为便捷。
|
6月前
|
存储 SQL Java
JAVAEE框架数据库技术之13_oracle 之PLSQL技术及存储过程和函数(一)
JAVAEE框架数据库技术之13_oracle 之PLSQL技术及存储过程和函数
63 0
|
6月前
|
存储 SQL Oracle