如何徹底殺掉不良用戶會話


在ORACLE數據庫當中,有時候會使用ALTER SYSTEM KILL SESSION 'sid,serial#'殺掉一個會話進程,但是使用這個SQL語句殺掉會話后,數據庫並不會立即釋放掉相關的資源,有時候你會發現鎖定的資源很長時間也不會釋放,即使會話狀態為“KILLED”,依然會阻塞其它會話。

 

在ORACLE數據庫殺掉會話進程有三種方式:

1: ALTER SYSTEM KILL SESSION

關於KILL SESSION Clause ,如下官方文檔描述所示,alter system kill session實際上不是真正的殺死會話,它只是將會話標記為終止。等待PMON進程來清除會話。

    select sid,serial# from v$session where username='DEMO';查詢用戶的 sid,serial# 

 

 

可以使用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,然后殺掉。當然殺掉操作系統進程是一件危險的事情,尤其不要誤殺。所以在執行前,一定要謹慎確認。

 select SPID from v$process where addr in (SELECT PADDR FROM V$SESSION WHERE USERNAME='用戶名字');      (找到用戶的spid)

 

 kill -9 spid

 

 

在數據庫如果要徹底殺掉一個會話,尤其是大事務會話,最好是使用ALTER SYSTEM DISCONNECT SESSION IMMEDIATE或使用下面步驟:

 

1:首先在操作系統級別Kill掉進程。

 

2:在數據庫內部KILL SESSION

 

或者反過來亦可。這樣可以快速終止進程,釋放資源。

 


免責聲明!

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



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