Oracle kill sessin 說明

來源:互聯網
上載者:User

 

一.Session 狀態說明

Oracle session 有如下幾種狀態

ACTIVE - Sessioncurrently executing SQL

INACTIVE 

KILLED - Sessionmarked to be killed

CACHED - Sessiontemporarily cached for use by Oracle*XA

SNIPED - Sessioninactive, waiting on the client

 

在之前的blog裡有說明,參考:

Oraclesession active 和inactive 狀態 說明

http://blog.csdn.net/tianlesoftware/article/details/6539297

 

1.1 Active 狀態

active 處於此狀態的會話,表示正在執行,處於活動狀態。

            官方文檔說明:

            Anysession that is connected to the database and is waiting for an event that doesnot belong to the Idle wait class is considered as an active session.

 

1.2 Killed 狀態

killed處於此狀態的會話,被標註為刪除,表示出現了錯誤,正在復原。

            當然,也是佔用系統資源的。還有一點就是,killed的狀態一般會持續較長時間,而且用windows下的工具pl/sql developer來kill掉,是不管用的,要用命令:alter system kill session 'sid,serial#' ;

 

1.3 Inactive 狀態

inactive 處於此狀態的會話表示不是正在執行的,該狀態處於等待操作(即等待需要執行的SQL語句),通常當DML語句已經完成。 但串連沒有釋放,這個可能是程式中沒有釋放,如果是使用中介軟體來串連的話,也可能是中介軟體的配置或者是bug 導致。

 

            inactive對資料庫本身沒有什麼影響,但是如果程式沒有及時commit,那麼就會造成佔用過多會話。容易使DB 的session 達到極限值。

       一般不處理inactive 狀態的session, 如果達到了session 的最大值, 就增加processes 和 sessions 參數。 對於Inactive 狀態的session,可以設定到期時間,具體的2個參數是:

(1)sqlnet.ora檔案中設定expire_time 參數

(2)使用者profile的idle_time 參數

 

二. Kill session 說明2.1 查看session 類型

       Kill session 也是一個危險的操作,所以在kill之前要先確認session 的類型,如果我們kill 掉錯誤的後台進程的session,那麼可能就會導致執行個體crash。

 

       可以通過gv$session 和 gv$process 或者v$session 和 v$process 來確認session 類型。

 

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

 

 

樣本:

SQL> SET LINESIZE 100

SQL> COLUMN spid FORMAT A10

SQL> COLUMN username FORMAT A10

SQL> COLUMN program FORMAT A45

SQL> SELECT s.inst_id,

 2         s.sid,

 3         s.serial#,

 4         p.spid,

 5         s.username,

 6         s.program

 7  FROM   gv$session s

 8         JOIN gv$process p ONp.addr = s.paddr AND p.inst_id = s.inst_id

 9  WHERE  s.type != 'BACKGROUND';

 

  INST_ID        SID    SERIAL# SPID       USERNAME   PROGRAM

---------- ---------- ---------- -------------------- ------------------------

        1        133         22 4816       SYS        sqlplus.exe

        1         21          6 3176       SYS        Toad.exe

        1         19         35 3248       SYS        Toad.exe

 

SQL>

 

 

2.2 ALTER SYSTEM KILL SESSION 說明

Kill session 的基本文法如下:

SQL> ALTER SYSTEM KILL SESSION 'sid,serial#';

 

在RAC 環境下,我們還可以在文法中指定INST_ID. 這個值可以從gv$session 中擷取:

SQL> ALTERSYSTEM KILL SESSION 'sid,serial#,@inst_id';

 

Kill session 命令實際不會kill session。 該命令僅要求session 自己kill 自己。 在以前情況下,比如等待遠端資料庫的反應或者復原事務,那麼session 就不會立即kill 自己,其必須等待當前的操作結束才能執行。 在這種情況下,session 就會被標記為killed 狀態。 它會儘快被kill。

 

       我們可以在kill 命令中添加immediate,文法如下:

SQL> ALTERSYSTEM KILL SESSION 'sid,serial#' IMMEDIATE;

 

       這個命令不會影響效能,但它會立即返回到當前的session,處理kill操作,而不是等待其他的資訊完成。

 

       如果session 一直處於killed 狀態,那麼可以考慮在作業系統層級kill掉相關的進程。不過在操作之前,要先確認session 是否在執行rollback 操作。 可以使用如下SQL 來確認。

 

SET LINESIZE 200

COLUMN username FORMAT A15

 

SELECT s.username,

      s.sid,

      s.serial#,

      t.used_ublk,

      t.used_urec,

      rs.segment_name,

      r.rssize,

      r.status

FROM  v$transaction t,

      v$session s,

      v$rollstat r,

      dba_rollback_segs rs

WHERE s.saddr = t.ses_addr

AND   t.xidusn = r.usn

AND   rs.segment_id = t.xidusn

ORDER BY t.used_ublk DESC;

 

如果有我們的session,那麼就要等rollback 先完成,然後才能在作業系統層級kill session。

 

2.3 ALTER SYSTEM DISCONNECT SESSION 說明

 Alter system disconnect session 是一個可選的kill session 的方法。 與kill session 命令不同,disconnect session 命令會kill 掉 dedicated server process, 該命令等同於在作業系統層級kill 掉server process。

 

具體文法如下:

SQL> ALTER SYSTEM DISCONNECT SESSION'sid,serial#' POST_TRANSACTION;

SQL> ALTER SYSTEM DISCONNECT SESSION'sid,serial#' IMMEDIATE;

 

POST_TRANSACTION 選項會等待事務完成之後在中斷連線。

IMMEDIATE 選項會立即中斷連線,然後事務會進行recover操作。

 

這2個選項也可以一起使用,但是必須指定其中一個,否則就會報錯:

SQL> alter system disconnect session'30,7';

alter system disconnect session '30,7'

                                     *

ERROR at line 1:

ORA-02000: missing POST_TRANSACTION orIMMEDIATE keyword

SQL>

 

SQL> alter system disconnect session'15,12' post_transaction immediate;

System altered.

      

使用alter system disconnectsession 命令就不需要切換到系統來kill session,也從而減少了kill 錯進程的幾率。

 

2.4 PMON 進程清理KILLED的session

MOS 上的幾篇相關文章:

ALTER SYSTEM KILL Session Marked for KilledForever [ID 1020720.102]

Removing Sessions in Killed Status on Unix[ID 274216.1]

ALTER SYSTEM KILL SESSION does not ReleaseLocks Killing a Thread on Windows NT [ID 100859.1]

 

在之前說過,如果我們使用alter system kill session 命令,是要求session 自己kill 自己,這個過程可能需要等待遠程事務的回應或者復原事務,在這個狀態會被標記為killed,並且可能需要等待很長時間,等這些操作完成之後才會kill掉。

 

Killing thesession will not clear the locks.  Thesession on the remote database will remain idle waiting for input until thenetwork read times out. Only then the kill session is processed, and locks arereleased.

 

 

要釋放這些狀態為killed的session,可以重啟DB,也可以直接在OS 層級kill 進程, windows 下使用ORAKILL 命令,UNIX 直接使用kill 命令。

 

       對於這些狀態為KILLED的session,PMON 進程也會清理它,MOS的解釋如下:

 

It does notexplicitly indicate what happens to the session while it is in the KILLEDPSEUDO state.  What's happening is thatPMON periodically checks to see if any sessions have been killed.

       PMON 會週期性檢查是否有session 被標記為killed。

 

If it finds one,it attempts to rollback the transaction for that session (that was in progresswhen it was killed).  The reason this cantake a long time is because PMON may have more than one transaction to rollbackat a time (if other sessions have been killed, or if processes have died etc).

--如果PMON 發現了一個被標記為killed的sessin,那麼PMON 會嘗試rollback這個事務。這個操作可能需要很長時間,因為PMON 進程可以一次復原多個事務。

 

Thus, it maytake a while to finally cleanup the killed session and have it disappear fromthe session monitor.  The system i/omonitor correctly shows the reads and writes being performed by PMON in orderto rollback the session's transaction.

--PMON可能需要很長的時間來清理killed session,從session Monitor就看不到。但是從systemI/O上可以顯示PMON 產生的讀寫。

      

PMON will notdelete the session object itself until the client connected to that sessionnotices that it has been killed. Therefore, the sequence of events is:

   --PMON 不會刪除session 對象直到client 再次串連標記為killed的session 時,具體的操作過程順序如下:

1) alter system kill session is issued -the STATUS of the session object in V$SESSION becomes KILLED, its serverbecomes PSEUDO.

      

2) PMON cleans up the *resources* allocatedto the session

  (i.e., rolls back its transaction, releases its locks, etc).

      

3) the entry in V$SESSION remains thereuntil the client of that session (the client is the process associated with theOSUSER,MACHINE,PROCESS columns in the V$SESSION view) tries to do anotherrequest.

      

4) the client attempts another SQLstatement and gets back ORA-28.

      

5) PMON can now remove the entry from V$SESSION.

  This behavior is necessary because the client still has pointers to thesession object even though the session has been killed.  Therefore, the object cannot be deleted untilthe client is no longer pointing at it.

 

三. 在作業系統層級清理killed session 進程

如果標記為KILLED的session 等了很長時間還沒有被清理掉,那麼只能在OS層級來kill 進程。 注意這裡不能kill DB 的進程,否則會導致DB crash。

 

之前整理的Blog就是一個樣本,參考:

Oracle 預存程序 無法編譯 解決方案

http://blog.csdn.net/tianlesoftware/article/details/7412555

 

3.1 查看seesion的具體資訊:

 

SELECT sid, serial#, username,process,machine, terminal, program,

osuser, logon_time, last_call_et

FROM v$session

WHERE username IS NOT NULL

AND status != 'ACTIVE'

ORDER BY last_call_et

/

 

3.2  查看SPID

可以使用如下SQL:

select spid,osuser, s.program

from v$session s,v$process p

where s.paddr=p.addr and s.sid=958;

 

或者:

SELECT s.sid, s.serial#, p.spid

FROM v$session s,v$process p

WHERE s.paddr = p.addr

 

3.3 kill 進程

(1)在Unix 平台下

kill -9 <spid>

 

(2)Windows 平台

c:\> orakill <SID> <spid>

 

where <SID>  = the Oracle instance name (ORACLE_SID)

     <spid> = the thread id of the thread to kill

 

 

 

 

 

 

-------------------------------------------------------------------------------------------------------

著作權,文章允許轉載,但必須以連結方式註明源地址,否則追究法律責任!

Skype: tianlesoftware

Email:   tianlesoftware@gmail.com

Blog:     http://www.tianlesoftware.com

Weibo: http://weibo.com/tianlesoftware

Twitter: http://twitter.com/tianlesoftware

Facebook: http://www.facebook.com/tianlesoftware

Linkedin: http://cn.linkedin.com/in/tianlesoftware

 

 

-------加群需要在備忘說明Oracle資料表空間和資料檔案的關係,否則拒絕申請----

DBA1 群:62697716(滿);   DBA2 群:62697977(滿)  DBA3 群:62697850(滿)  

DBA 超級群:63306533(滿);  DBA4 群:83829929   DBA5群: 142216823

DBA6 群:158654907    DBA7 群:172855474   DBA總群:104207940

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.