當User Process 偶爾會因不當的操作或PL-SQL 造成LOOP而佔用大量的系統資源時,往往會影響其他的SESSION,如果DBA能夠還能夠登入DATABSE的話通常會以下列方式查詢:
select s.username, s.osuser, s.sid, s.serial#, p.spid from v$session, v$process p where s.paddr = p.addr and s.username is not null;
這個查詢將回傳資料庫使用者名稱、作業系統使用者名稱、Session ID、序列號碼和Process ID(SPID)。然後DBA就可以下SQL Kill該USER:
alter system kill session 'sid, serial#';
這句SQL有兩個問題。第一、分配給要Kill的 Process任何Lock或Resource在Session完全超時之前部會被釋放。第二、查詢和Kill指令需要在登入資料庫時執行,如果一個Process異常,那資料庫Session可能會出現問題。
在Unix資料庫中,可使用 ps指令,該指令會顯示提示中定位的Process(同樣找到OSUSER和SPID)然後使用 Kill -9 spid 結束異常的Process。而在Windows中卻只有一個ORACLE.EXE背景的Process在產生執行緒連結USER在Windows執行緒中處理相關作業。如果可用工作管理員來結束Oracle在Windows的Process的話就會影響所用使用者的Session並導致資料庫發生不可預期的錯誤。
在以上原因,Oracle提供一個ORAKILL.EXE執行檔,這個執行檔的參數與 ALTER SYSTEM KILL SESSION 'XX, XX';相同,但是不需要先連結資料庫。要指定一個特定的 Process 需要先找出顯示屬於這個 Process 的所有程式。Windows 工作管理員只能顯示 Process 各數與 Process 名稱,你需要從 Microsoft 的光碟中尋找一個用於 Windows 2000 或 NT 的工具程式,比如免費的 QuickSlice 、Qslice.exe 或是 PStst(Pstat.exe執行檔)。簡單的在 ORAKILL.EXE 指令後輸入 Process ID(十進制表示)和 SID 即可:
orakill
"Kill of thread id 1429 in instance ORCL successfully signalled[sic]."
對於以上方法最好是使用於無法登入資料庫執行 ALTER SYSTEM KILL SESSION 'XX, XX'; 時使用,因為不小心 Kill 掉一個必要的後端 Process 時,如:PMON ,那很有可能會導致資料庫嚴重損毀。 |