oracle死进程查找与删除方法

本文介绍了解决Oracle数据库中编译包时遇到卡死及ORA-04021错误的方法。通过查找锁定的进程,手动停止并删除job,最终解决了编译包时的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

2010年11月3日

    到了下午,一编译我的oracle包就出现卡死状态,过了好久终于在弹出一个错误“ora-04021”错误,经过查找原来是我的job在执行(job执行的包正式我编译的包怪不得编译不了)。因此查找原因时可以通过以下几个表来查看具体的进程死锁:

   v$lock;--查看锁的状态

  v$session;--查看进程

因此我就将此job停止,但是停止后查看select * from dba_jobs_running,发现该job仍在,因此将该job手动删除,但是仍然没用,因此采用以下方法进行杀进程:

 首先找到该进行的session_id: select xidusn, object_id, session_id, locked_mode from v$locked_object; 131
 然后找到该进程的serial# :select username,sid,serial# from v$session where sid=131; 372
 最后杀掉该进程:alter system kill session '131,372';

发现该job已经成功删除

直接查出被锁对象,id,系统进程号sql:

SELECT object_name, s.sid, s.serial#, p.spid
  FROM v$locked_object l, dba_objects o, v$session s, v$process p
 WHERE l.object_id = o.object_id
   AND l.session_id = s.sid
   AND s.paddr = p.addr;

   注:或者直接在操作系统上执行 kill -9 spid

       spid即为如上sql的p.spid(v$process表的spid)

如果是xp系统,则删除方式为orakill orasid spid(orasid即数据库的sid如默认安装的就是orcl)

 

如上sql无法找到被锁的对象,可以试着通过该sql进行查找

SELECT  * FROM dba_ddl_locks  WHERE NAME='object_name'

 

如果Oracle是集群环境,很可能plsql连接后查询找不到被锁的对象,可以直接到数据u服务器上执行语句进行查找

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值