Oracle 编译存储过程卡死解决方法

原由

事情是这么发生的:当天网络很差,一个简单的查询语句都会卡一下,在完成一个存储过程以后点击编译,plsql就卡住了。在等待了一段时间后,plsql仍是没有响应,我觉得是网络太卡致使,就直接结束了plsql的进程,准备从新登录(如今看这么作仍是有待商榷的)。等到我再次登录编译后,plsql就再次卡死,以后又尝试了好几回,每次都是一编译就卡死。sql

解决过程

既然这个问题已经能够进行复现,而且同一个数据库另外一个用户登录正常,就能够基本排除是网络波动形成。因而首先判断是有锁,因而使用了数据库

SELECT l.session_id sid,  
       s.serial#, 
       l.locked_mode,  
       l.oracle_username,  
       l.os_user_name, 
       s.machine,  
       s.terminal,  
       o.object_name,  
       s.logon_time,  
       p.SPID  
  FROM v$locked_object l, all_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  
 ORDER BY sid, s.serial#; 
复制代码

进行查询,可是却没有查询到任何记录。 接着利用bash

select * from dba_ddl_locks
复制代码

进行查询,如果只是想查询特定对象,能够加where name='XXX'进行筛选,可是这里我是想看一下到底多少资源在锁,因此没有加条件。 这个语句的查询很是慢,一开始我觉得网络又出问题了,后来等了一会才返回结果。网络

利用这个语句就查询到了那个存储过程的确是存在锁。利用kill将sessionkill掉session

select sid,serial# from v$session where sid=XXX;
alter system kill session 'XXX,XXXXXX';
复制代码

再次执行编译,成功。。oracle

总结

V$LOCKED_OBJECT中只能查询到DML锁,DDL锁是查询不到的, 经过dba_ddl_locks能够查询到数据库中 的ddl锁,其实dml锁一样能够经过dba_dml_locks视图进行查询,在每次发现有锁的时候要区分锁的种类进行查询。ui

相关文章
相关标签/搜索