如何安全快速的批量刪除Oracle數據庫外部會話session

在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';

在數據庫如果要徹底殺掉一個會話,尤其是大事務會話,最好是使用兩種方式:

  1. 使用ALTER SYSTEM DISCONNECT SESSION IMMEDIATE
  2. 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;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章