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

相關文章
相關標籤/搜索