查看Oracle中存储过程长时间被卡住的原因

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了查看Oracle中存储过程长时间被卡住的原因相关的知识,希望对你有一定的参考价值。

1:查V$DB_OBJECT_CACHE

SELECT * FROM V$DB_OBJECT_CACHE WHERE name=‘CUX_OE_ORDER_RPT_PKG‘ AND LOCKS!=‘0‘;

注意:CUX_OE_ORDER_RPT_PKG 为存储过程的名称。

发现 locks=2

2:按对象查出sid的值

select /*+ rule*/  SID from V$ACCESS WHERE object=‘CUX_OE_ORDER_RPT_PKG‘;

注意:CUX_OE_ORDER_RPT_PKG 为存储过程的名称。

3:查sid,serial#

SELECT SID,SERIAL#,PADDR FROM V$SESSION WHERE SID=‘刚才查到的SID‘;

4、根据会话id(sid),此会话的等待事件:

  1. select * from v$session where sid=***;  

event字段即为等待事件。查询后我们发现这个会话等待事件为SQL*Net message from dblink;在查看会话的logon_time为两天前。这个时间远超过我们估计时间。

5、根据会话id查看此会话正在执行的sql语句

  1. select sql_text from v$sqlarea where address= (select   sql_address  from v$session where sid=***);  

查询后发现正在执行的sql语句为通过dblink到远程数据库上A表查询数据,插入到B表。

6、连接远程数据库,查询当前被锁的对象

  1. select * from v$locked_object lo ,   
  2. all_objects  ao    where lo.OBJECT_ID= ao.object_id ;  

查看后发现远程数据库中并没有涉及到A、B表被锁

7、查看远程数据的会话:

  1. select * from v$session where terminal like ‘%机器名%‘  and program=‘Oracle.exe‘  

使用dblink连接远程数据库,在远程数据库上的会话的program应该是是oracle.exe

查询后发现,两个远程库有时候根本没有相关会话,有时候可能有相关会话,但其等待事件是 SQL*Net message from client 远程库在等待本地Oracle给他发请求。

 

本地库等dblink远程库,远程库等待client消息。看来这个存储过程是不可能执行完了。

具体什么原因造成了,还不清楚。

 

这里给出的处理方法就是杀死会话


http://blog.csdn.net/fupei/article/details/7325190

具体步骤可参考上面的文章



以上是关于查看Oracle中存储过程长时间被卡住的原因的主要内容,如果未能解决你的问题,请参考以下文章

pl/sql编译存储过程卡住的解决方法

存储过程中的光标完成并卡住(Oracle Linux VM 上的 Oracle 11g)

ORACLE存储过程创建失败,如何查看其原因

请问,我用报表调用的oracle数据库的数据存储过程乱码是啥原因啊?

存储过程执行时间过长时发出 SQL 警报

oracle数据库中,存储过程中 %rowtype 类型的用法有啥限制吗?