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

栏目: 数据库 · 发布时间: 6年前

内容简介:事情是这么发生的:当天网络不好,一个简单的查询语句都会卡一下,在完成一个存储过程之后点击编译,plsql就卡住了。在等待了一段时间后,plsql还是没有响应,我以为是网络太卡导致,就直接结束了plsql的进程,准备重新登陆(现在看这么做还是有待商榷的)。等到我再次登陆编译后,plsql就再次卡死,之后又尝试了好几次,每次都是一编译就卡死。既然这个问题已经可以进行复现,并且同一个数据库另一个用户登陆正常,就可以基本排除是网络波动造成。于是首先判断是有锁,于是使用了进行查询,但是却没有查询到任何记录。 接着利用

事情是这么发生的:当天网络不好,一个简单的查询语句都会卡一下,在完成一个存储过程之后点击编译,plsql就卡住了。在等待了一段时间后,plsql还是没有响应,我以为是网络太卡导致,就直接结束了plsql的进程,准备重新登陆(现在看这么做还是有待商榷的)。等到我再次登陆编译后,plsql就再次卡死,之后又尝试了好几次,每次都是一编译就卡死。

解决过程

既然这个问题已经可以进行复现,并且同一个数据库另一个用户登陆正常,就可以基本排除是网络波动造成。于是首先判断是有锁,于是使用了

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#;  
复制代码

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

select * from dba_ddl_locks
复制代码

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

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

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

再次执行编译,成功。。

总结

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


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

重新定义管理

重新定义管理

[美]布赖恩·罗伯逊 / 中信出版社 / 2015-10-1 / 45

还没听说过合弄制?你一定会听说的。终于,迎来了一本合弄制创建者的著作,讲解了这一公司经营方式的革命性新系统及其实施方法。 今天的商界,情况瞬息万变。但在绝大多数组织中,最具资格响应变化的人们却几乎都没有权力去做出改变。相反,他们不得不遵守那些由领导们设立的亘古不变的战略,而且这些领导们仍然相信“预测和控制”才是有效管理的关键。 合弄制向你展示了怎样让组织中工作的每一个人都成为一名领导,......一起来看看 《重新定义管理》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具