查看進程:
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;