Oracle下Kill進程的方法

 1:先在oracle數據庫中找到鎖住的對象:linux

select xidusn, object_id, session_id, locked_mode from v$locked_object;sql

2:獲得session_id。再根據session_id找到v$session對應的sid號和serial#:
select username,sid,serial# from v$session where sid=session_id;數據庫

3:用oracle的slq kill掉相關的session sql語句:
alter system kill session 'sid,serial#';session

4:若是不能kill掉,報ora-00031錯:說明以前有kill過,這樣找到這個進程spid slq語句:
select pro.spid from v$session ses,v$process pro where ses.sid=129 and ses.paddr=pro.addr;oracle

5:根據這個spid對應linux下的進程pid
linux命令:
ps -ef | gre | 'ora' (找到全部ora開頭的進程)ide

kill -9 (pid)spa

6:搞定收工。對象

 

 

下面主要介紹若是這個進程是Killed狀態的時候該怎麼處理:接口

先介紹三個視圖吧:v$process是ORACLE處理的進程,v$session是ORACLE處理的會話,v$sqlarea是ORACLE處理的SQL語句存放區就是共享池那東西。三個表聯合查一下。SELECT P.pid,S.sid,s.serial#,P.spid,S.username,S.osuser,P.serial#,P.terminal,P.program,P.background,S.status,A.sql_text 
FROM v$process P, v$session S,v$sqlarea A WHERE P.addr = s.paddr AND S.sql_address = a.address (+) order by P.spid;結果就是下面這樣[/img] 
這裏面查出來的就是ORACLE實時正在處理的SQL語句過程等。固然還包含基本的(PMON)(DBW0)(LGWR)等後臺進程。有時候你們編譯過程時,怎麼都編譯不過去其實過程是好着的.這就是ORACLE出現死鎖了.死鎖了確定是鎖最後一個會話,那就是你編着的那個.這時候你們有能夠要從新SHUTDOWN IMMEDIATE才行解決問題.其實運行上面的語句再配合下面的就能夠了.在Oracle數據庫中,能夠經過kill session的方式來終止一個進程,alter system kill session 'sid,serial#' ;這裏sid,serial#就是上面的v$session.sid,v$session.serial#這二值,多運行幾回上面的SELECT語句就能夠查出你被鎖住的那個過程.其它不明的不能通殺了.這裏關鍵就是要查出你要殺的v$session.sid,v$session.serial#二個值.而後作alter system kill session 'sid,serial#' ;作完之後.你的客戶端通常就直接提示SESSION KILLED.但也有不提示沒反映.再運行SELECT語句,發現v$session.status爲KILLED.再等待仍是同樣.本人也比較鬱悶,從書上查知被kill掉的session,狀態會被標記爲killed,Oracle會在該用戶下一次touch時清除該進程.Oracle就等待PMON去清除這些Session.一般等待一個被標記爲Killed的Session退出須要花費很長的時間.但我歷來都沒等及過.這不又白殺了.不要緊,用必殺招,在LINUX下殺.你用SELECT查出來的時候還有一個v$process.spid列.在LIUNX的$下運行TOP.[/img]你知發現了原來這一列的值,就是TOP下的PID值.那這樣好辦了.直接在LIUNX的$下 KILL -9 v$process.spid 這個值是要你在SELECT下要記錄下的.好了.這就必殺了.過程編譯不過去,確定是有會話地運行.出現過這問題.用已上方法解決過.其它配合進程

SELECT P.pid,S.sid,s.serial#,P.spid,S.username,S.osuser,P.serial#,P.terminal,P.program,P.background,S.status,A.sql_text 
FROM v$process P, v$session S,v$sqlarea A WHERE P.addr = s.paddr AND S.sql_address = a.address (+) order by P.spid;
和LIUNX的下的TOP大家會發現不少東西的.好比說接口程序是很佔CPU的還有查到實時會話.

 


ps 和 top均可以看系統中正在運行的進程
ps 命令提供了當前運行進程的快照。
使用帶有 -ef 選項的 ps ,返回系統中全部用戶的全部進程的完整列表。若是您將此 ps 命令的結果傳送到 grep 中,則該結果更易於查看。例如: 
$ ps -ef | grep oracle
這條命令會顯示:
UID PID PPID C STIME TTY TIME CMD

oracle 1633 1 0 13:58 ?00:00:00 ora_pmon_ora1

oracle 1635 1 0 13:58 ?00:00:00 ora_dbw0_ora1

oracle 1637 1 0 13:58 ?00:00:01 ora_lgwr_ora1

oracle 1639 1 0 13:58 ?00:00:02 ora_ckpt_ora1 下面是ps的選項 -A:列出全部的進程。  -l:顯示長列表。 -m:顯示內存信息。 -w:顯示加寬能夠顯示較多的信息。  -e:顯示全部進程。 a:顯示終端上的全部進程,包括其它用戶的進程。 -au:顯示較詳細的信息。 -aux:顯示全部包含其它使用者的進程。  要即時查看最活躍的進程,可以使用 top

相關文章
相關標籤/搜索