数据库实际操作过程中,有时候会遇到进程一致处于繁忙阶段,命令行中无法终端其进程的运行,这个时候我们就想是否可以找到具体进程及其句柄,将其杀死,从而使系统资源得到释放。下面我们来做个试验:
一、 实验环境
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
二、 查看现象及报错
多一个表进行操作,导致出现表锁的情况,报错如下
SQL> drop table it purge;
drop table it purge*
ERROR at line 1:
ORA-00054: 资源正忙 , 但指定以 NOWAIT 方式获取资源 , 或者超时失效从现场的症状,我们做删除,修改表,处于等待状态,无法操作。
三、 处理问题
1、 查看是否有被锁的对象;
select * from v$locked_object;
2、 得到被锁对象的 session_id;
select session_id from v$locked_object;
3、 通过 session_id去获得 v$session的 sid和 serial#; SELECT sid, serial#, username, osuser FROM v$session where sid = '1147'; SELECT sid, serial#, username, osuser FROM v$session where sid = '1705'; 4、 杀死锁表进程。 ALTER SYSTEM KILL SESSION '1147,13'; ALTER SYSTEM KILL SESSION '1705,21'; 5、 删除表 scott.it资源繁忙情况解决。 总结:通过以上杀死僵死进程过程中,我们首先得找出具体的锁进程,这方便我们在后期优化过程中语句执行慢,给自己找了一点思路。
Yicheng16 22.08.16
-- The End --
