kill plsql增强之kill sql

  SQL报错
内容纲要

概要描述


如何查看和终止正在运行的存储过程PLSQL这篇kb中我们介绍了通过sql语句来kill掉plsql的方法,然而在使用过程中,我们常常会遇到下面的场景:

  • 客户想把卡在拿锁上的DDL给kill掉;
  • 客户发现/tmp 目录下面不停增长,基本上能确定是plsql 导致的;

虽然我们可以用ps plsql和kill plsql命令来干掉,但是不能看到该plsql的详细信息,比如执行时间,owner等等。所以现在,在数据字典中提供了视图processes_v,用以查看所有在执行的进程(dml,ddl,plsql,stream sql?)。故我们增强了kill plsql命令,升级成为kill sql命令,可以输入operation id 来干掉任何dml/ddl/plsql 等。

相比kill plsql,适用于更多的sql类型,e.g:

  • sql 类型:ddl,dml,plsql
  • plsql 种类:while,for,cursor,sleep
  • dml 种类:join,group by,其他
  • dml 模式:insert,ctas,select

支持版本:>=TDH6.1

详细说明


1. 执行测试plsql块

--结合睡眠函数和for循环构造一个执行时间稍长的plsql
BEGIN
    FOR i IN 1..10 LOOP
        put_line(i||' '||to_char(sysdate,'yyyy-MM-dd HH:mm:ss'))
        dbms_lock.sleep(10)
    END loop
END

2. 查看正在运行的PLSQL

这条命令会显示operation_id、session_id和SQL语句,使用者需要从中找到自己想要终止的SQL的operation_id;

> SELECT running_sql() from system.dual;
--或者
> SELECT * FROM system.processes_v WHERE statement NOT LIKE '%processes_v%' AND user_name=CURRENT_USER();
--或者
> SELECT * FROM system.processes_v;

3. 终止正在运行的某条PLSQL

这条命令会发送一个终止信号给该session id中的PLSQL进程,待该进程下一次自检之时,发现有终止信号,则会结束自己;

-- KILL SQL ;
> KILL SQL 4e604d53-3445-4a96-bc3f-54288502a666

对应的plsql语句会抛出异常,

SQL 错误 [1000] [HY008]: Statement is canceled by other thread. One possible reason is that the session/operation is closed due to time expiration. Please check these conf variables: ‘hive.server2.idle.session.timeout’ or ‘hive.server2.idle.operation.timeout’ (for SQL) or ‘hive.server2.idle.plsql.operation.timeout’ (for PLSQL).

这篇文章对您有帮助吗?

平均评分 5 / 5. 次数: 1

尚无评价,您可以第一个评哦!

非常抱歉,这篇文章对您没有帮助.

烦请您告诉我们您的建议与意见,以便我们改进,谢谢您。