处理Oracle被锁住的进程

      5月11日 发布一个EBS程序,PLSQL Developer编译提示“程序被锁”。之前此程序发布过,后来对代码进行了优化,重新发布。因为Oracle为确保数据的完整性和一致性,所以会锁住正在运行的程序。由于当时还没有完全掌握杀掉session的方法,只有等到第二天锁被自动释放后才完成编译操作。
 
处理被锁进程的方法如下,请大家参考。

一、解决办法

1、执行以下语句子,获得被锁表的Session ID
select b.owner,b.object_name,a.session_id,a.locked_mode
from dba_objects b, v$locked_object a
where b.object_id = a.object_id
and b.object_name='PER_ALL_ASSIGNMENTS_F';
 
 2、运行PL/SQL,ToolsSessions,对比刚才获得的Session ID,Kill掉被锁的Session。被kill掉的session状态会被标记为killed,Oracle会在该用户下一次touch时清除该进程。
     另外SQLPLUS执行alter syst kill session 'xx,xxxx'; (其中xx,xxxx分别是查询到的sid,serial#)也可以杀掉被锁进程;如果有ORA-00031错误,则在后面加参数immediate;命令:alter system kill session 'xx,xxxx' immediate;
 
3、如果被置为"Killed"的进程长时间未被释放,可以在OS一级再杀死相应的进程,执行以下语句获得OS进程号(PID):
select spid, osuser, s.program
from v$session s,v$process p
where s.paddr=p.addr and s.sid=xx (xx就是锁表的Session ID)
 
4、在OS层杀死这个进程:
kill -9 xxxxx(xxxxx就是3步查询出的SPID)
 
 
二、实验
 
以上操作是否会影响其他session,即被杀(kill)掉的OS进程是否跟其他session 相关?下面我们来做一下测试。
1、查询Oracle进程信息
select saddr,sid,serial#,paddr,username,status from v$session where username is not null;
 
2、执行下面的SQL语句获得SPID号。(语句中的115是第一步查询到的SID号)
select spid, osuser, s.program
from v$session s,v$process p
where s.paddr=p.addr and s.sid=115
 
3、在OS上杀死上面获得的进程
KILL -9 2478436
 
4、 再次执行查询语句
select saddr,sid,serial#,paddr,username,status from v$session where username is not null;
SID为115的进程消失了。
 
5、 通过以上实验,说明v$sessions和v$process是相对应的,通常情况下Kill掉对应的OS进程不会影响到其他session。(具体情况需要跟开发人员进沟通 )
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章