概要描述
在如何查看和终止正在运行的存储过程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;
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).