在編譯的一個存儲過程的時候,對象可能由於被鎖住而處於假的卡死狀態,這個時候有的是因為,這個過程正在運行中,所以無法編譯;
上次我遇到一次,我很清楚的確定這個過程沒有運行,可以我就是無法編譯,對象一直被鎖。我糾結了好久,終於找到的解決的辦法。
select * FROM dba_ddl_locks where name = upper('p_sys_job_crtpartition_c10');
先從dba_ddl_locks中查詢對象被哪些進程鎖住,得到他們的SESSION_ID;
--alter system kill session 'sid ,SERIAL#';
select t.sid, t.serial#, 'alter system kill session ''' || sid || ' ,' || t.serial# || ''';'
from v$session t
where t.sid in (145, 143, 17, 137, 15, 139, 12, 133);
然后將SESSION_ID傳入v$session中,與sid關聯,可以在oracle中殺掉這些session;
--kill -9 spid;
select spid, osuser, s.program, 'kill -9 ' || spid || ''
from v$session s, v$process p
where s.paddr = p.addr
and s.sid in (145, 143, 17, 137, 15, 139, 12, 133);
第三步,也就是我一直糾結的,就是我發現這些session都是killed狀態的,卻依然鎖着對象不釋放,最后我就通過查詢得到spid,進入OS系統,用root用戶登錄,直接kill -9 XX這些進程,就可以釋放資源了。
