ORACLE 存儲過程解及表解鎖和停止執行


查看進程:

select * from v$process

 

根據存儲過程名稱查找是否被鎖:

select * FROM dba_ddl_locks where name =upper('sp_1');

select * FROM dba_ddl_locks where name like upper('%sp_1%');

select sess.sid, 
    sess.serial#, 
    lo.oracle_username, 
    lo.os_user_name, 
    ao.object_name, 
    lo.locked_mode 
    from v$locked_object lo, 
    dba_objects ao, 
    v$session sess 
where ao.object_id = lo.object_id and lo.session_id = sess.sid; 

 

select  s.*
from v$locked_object l, dba_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
   AND object_name= upper(''表或存儲過程名字');

  

 

查找SID:

select t.sid,t.serial# from v$session t
where t.sid=550;

 

殺session解鎖:

alter system kill session '550,10047' immediate;

--sid,t.serial#

 

如果利用上面的命令殺死一個進程后,進程狀態被置為"killed",但是鎖定的資源很長時間沒有被釋放,那么可以在os一級再殺死相應的進程(線程),首先執行下面的語句獲得進程(線程)號:
select spid, osuser, s.program from v$session s,v$process p where 
s.paddr=p.addr and s.sid=550 

(550就是上面的sid)

 

單機:
SELECT A.PID, B.SID, B.SERIAL#, C.SQL_TEXT,A.SPID
  FROM V$PROCESS A, V$SESSION B, V$SQLAREA C
 WHERE A.ADDR = B.PADDR
   AND B.SQL_ADDRESS = C.ADDRESS

rac:

SELECT A.PID, B.SID, B.SERIAL#, C.SQL_TEXT,A.SPID
  FROM GV$PROCESS A, GV$SESSION B, GV$SQLAREA C
 WHERE A.ADDR = B.PADDR
   AND B.SQL_ADDRESS = C.ADDRESS

再到linux下 kill -9 pid

 

 

殺會話

select  a.USERNAME,a.MACHINE, sql_text,'alter system kill session '''||a.SID||','||a.SERIAL#||',@'||a.INST_ID||'''immediate;' ,status 
from gV$session a inner join GV$sql b on a.sql_id=b.sql_id 
WHERE status = 'ACTIVE'

 

定時任務,殺掉特定服務器上執行超過一個小時的語句

create or replace procedure ks_kill_sp_timeout
    /******************************************************************
      存儲過程名稱:
      存儲過程內容:監控存儲過程是否正常
      作者姓名: 
      編寫時間: 2017年4月17日
      輸入參數:

      輸出參數:
    *******************************************************************/
as
    v_sql varchar2(2000);
    v_count number;
begin

select count(distinct 'alter system kill session '''||a.SID||','||a.SERIAL#||',@'||a.INST_ID||''' immediate;')  into v_count
from gV$session a inner join GV$sql b on a.sql_id=b.sql_id
WHERE a.status = 'ACTIVE'
and a.MACHINE = 'db'
and ceil( (sysdate - a.SQL_EXEC_START) * 24 * 60) >= 60 ;

if v_count > 0 then
  select distinct 'alter system kill session '''||a.SID||','||a.SERIAL#||',@'||a.INST_ID||''' immediate;'  into v_sql
  from gV$session a inner join GV$sql b on a.sql_id=b.sql_id
  WHERE a.status = 'ACTIVE'
  and a.MACHINE = 'db'
  and ceil( (sysdate - a.SQL_EXEC_START) * 24 * 60) >= 60 ;
  
  dbms_output.put_line(v_sql);  
  execute immediate v_sql;
else
  dbms_output.put_line(v_count);
end if;




end;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM