在ORACLE數據庫殺掉會話進程有三種方式:
1:ALTER SYSTEM KILL SESSION
關於KILL SESSION Clause ,官方文檔描述alter system kill session實際上不是真正的殺死會話,它只是將會話標記爲終止。等待PMON進程來清除會話。
可以使用如下方式來快速回滾事物、釋放會話的相關鎖、立即返回當前會話的控制權。
SQL> ALTER SYSTEM KILL SESSION 'sid,serial#' IMMEDIATE
Specify IMMEDIATE to instruct Oracle Database to roll back ongoing transactions, release all session locks, recover the entire session state, and return control to you immediately.
2:ALTER SYSTEM DISCONNECT SESSION
ALTER SYSTEM DISCONNECT SESSION 殺掉專用服務器(DEDICATED SERVER)或共享服務器的連接會話,它等價於從操作系統殺掉進程。它有兩個選項POST_TRANSACTION和IMMEDIATE, 其中POST_TRANSACTION表示等待事務完成後斷開會話,IMMEDIATE表示中斷會話,立即回滾事務。
SQL>ALTER SYSTEM DISCONNECT SESSION 'sid,serial#' POST_TRANSACTION;
SQL>ALTER SYSTEM DISCONNECT SESSION 'sid,serial#' IMMEDIATE;
3:KILL -9 SPID(Linux)或orakill ORACLE_SID spid(Windows)
可以使用下面SQL語句找到對應的操作系統進程SPID,然後殺掉。當然殺掉操作系統進程是一件危險的事情,尤其不要誤殺。所以在執行前,一定要謹慎確認。
SET LINESIZE 100
COLUMN spid FORMAT A10
COLUMN username FORMAT A10
COLUMN program FORMAT A45
SELECT s.inst_id,s.sid,s.serial#,p.spid,s.username,s.program
FROM gv$session s
JOIN gv$process p ON p.addr = s.paddr AND p.inst_id = s.inst_id
WHERE s.type != 'BACKGROUND';
在數據庫如果要徹底殺掉一個會話,尤其是大事務會話,最好是使用兩種方式:
- 使用ALTER SYSTEM DISCONNECT SESSION IMMEDIATE
- OS層操作,使用下面步驟:
1:首先在操作系統級別Kill掉進程。
2:在數據庫內部KILL SESSION
或者反過來亦可。這樣可以快速終止進程,釋放資源。
針對方法1,可以使用如下
#oracle中批處理刪除外部連接session
SET LINESIZE 100
COLUMN spid FORMAT A10
COLUMN username FORMAT A10
COLUMN program FORMAT A45
declare cursor mycur is
SELECT s.inst_id,s.sid,s.serial#,p.spid,s.username,
s.program
FROM gv$session s
JOIN gv$process p ON p.addr = s.paddr AND p.inst_id = s.inst_id
WHERE s.type != 'BACKGROUND' and s.username not like '%SYS%';
SYS@groupts>SELECT s.inst_id,s.sid,s.serial#,p.spid,s.username,s.program
FROM gv$session s
JOIN gv$process p ON p.addr = s.paddr AND p.inst_id = s.inst_id
WHERE s.type != 'BACKGROUND' and s.username not like '%SYS%';
INST_ID SID SERIAL# SPID USERNAME PROGRAM
1 817 28719 20371 TEST_LY sqlplus@GBACKUP (TNS V1-V3)
begin
for cur in mycur
loop
execute immediate ( 'alter system kill session '''||cur.sid || ','|| cur.SERIAL# ||''' ');
end loop;
end;
/
#根據計算機名批量刪除會話,具體刪除條件可以自行調整上面的查詢語句
declare cursor mycur is
select b.sid,b.serial# from v$session b where b.MACHINE = 'svctag-79bp23x' and b.STATUS = 'INACTIVE';
begin
for cur in mycur
loop
execute immediate ( 'alter system kill session '''||cur.sid || ','|| cur.SERIAL# ||''' ');
end loop;
end;
/
【Notes】
1.本文講述了oracle數據庫上執行shutdown immediate命令時執行時間過長的原因以及解決辦法;
2.實際生產中推薦兩種方法批量刪除會話:
方法1:
SQL>ALTER SYSTEM DISCONNECT SESSION 'sid,serial#' IMMEDIATE;
方法2:
ps aux | grep "LOCAL=NO" | awk '{printf "%s\n",$2}'|xargs kill -9;