为了账号安全,请及时绑定邮箱和手机立即绑定

处理Oracle被锁住的进程

标签:
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。(具体情况需要跟开发人员进沟通 )

©著作权归作者所有:来自51CTO博客作者itserver_live的原创作品,如需转载,请注明出处,否则将追究法律责任

OracleSQLsessionOracle EBS


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

举报

0/150
提交
取消