Top > ALTER SYSTEM > KILL SESSION or DISCONNECT SESSION

ALTER SYSTEM KILL SESSION と DISCONNECT SESSION

Oracle 11g でようやくマニュアルに書かれている仕様なりつつある? ALTER SYSTEM KILL SESSION と ALTER SYSTEM DISCONNECT SESSION コマンド

ALTER SYSTEM KILL SESSION

Oracle 10g までの構文

ALTER SYSTEM KILL SESSION 'sid,serialNo' [ IMMEDIATE ]

Oracle 11g からの構文

ALTER SYSTEM KILL SESSION 'sid,serialNo[@instanceNo]' [ IMMEDIATE ]

KILL SESSION のみインスタンスを指定できるようになった。

ALTER DISCONNECT SESSION

Oracle 10g までの構文

ALTER SYSTEM DISCONNECT SESSION 'sid,serialNo' [POST_TRANSACTION] [IMMEDIATE]

Oracle 11g からの構文

ALTER SYSTEM DISCONNECT SESSION 'sid,serialNo' {POST_TRANSACTION | IMMEDIATE}

POST_TRANSACTION または IMMEDIATE の指定が省略可から不可になった。

ざっくり KILL SESSION と DISCONNECT SESSION の違い

ALTER SYSTEM KILL SESSION の場合

ALTER SYSTEM KILL SESSION は KILL 対象セッションに「KILL」依頼されましたよとマークを付与するだけで後は見てるだけ。実際のリカバリやリソースの解放の仕事はマークを付けられた側が行なう。

ジーッと見てたけど 60秒間待ってもセッションが終了されない場合…
「ORA-00031: セッションは強制終了されます。」とメッセージを出力され処理を終了してプロンプトが戻ってくる。

ALTER SYSTEM DISCONNECT SESSION の場合

ALTER SYSTEM DISCONNECT SESSION はよりアクティブなアプローチを行なう。DISCONNECT 対象となるセッションが専用サーバー接続の場合には、そのサーバープロセスを KILL する。

そうは言っても、DISCONNECT はマニュアル通りには動かないように見える。やった結果が仕様というのには、みんな慣れっこなのである。
ただ Oracle 11g になると…

DISCONNECT と KILL の IMMEDIATE 指定がそれらしく動作する光景 Oracle 11g

ALTER SYSTEM KILL SESSION や DISCONNECT SESSION にて IMMEDIATE を指定すると直ちにセッションが切断される。
というのが、この IMMEDIATE オプション付きの KILL SESSION 。

セッションA (Oracle 11g R2 にて)

SQL> begin
  2      dbms_session.set_identifier('my_id');
  3      dbms_lock.sleep(360); -- 6分間 休止
  4  end;
  5  /
  … スリープ中

セッションB

SQL> select sid, serial#, program, status from v$session where client_identifier = 'my_id';
 
       SID    SERIAL# PROGRAM                        STATUS
---------- ---------- ------------------------------ --------
       125        281 sqlplus@dbserver (TNS V1-V3)   ACTIVE
 
SQL> /** KILL SESSION の IMMEDIATE オプション付き **/
SQL> alter system kill session '125,281' IMMEDIATE;
 
システムが変更されました。

セッションA

SQL> begin
  2      dbms_session.set_identifier('my_id');
  3      dbms_lock.sleep(360);
  4  end;
  5  /
begin
*
行1でエラーが発生しました。:
ORA-03113: 通信チャネルでend-of-fileが検出されました プロセスID:
6020
セッションID: 125、シリアル番号: 281
/** メッセージに SID, SERIAL#, プロセスID まで表示されるサービス付き **/

仕様どおりに?…ちゃんと接続が切れてる … 初見時には何故に…?
dbms_lock.sleep はシステムコールっぽいのに… KILL SESSION で切断できるほど強力とは。

Oracle 11g なら Windows の orakill コマンドや UNIX の kill -9 のお世話にならなくても済みそうである。
ただ…やっぱり思うのはずっと KILL SESSION と DISCONNECT SESSION って実装は同…(略

Oracle 10g R2 の DISCONNECT …

セッションA

SQL> begin
  2      dbms_session.set_identifier('my_id');
  3      dbms_lock.sleep(360);
  4  end;
  5  /
  … スリープ中

セッションB

SQL> select sid, serial#, program, status from v$session where client_identifier ='my_id';
 
       SID    SERIAL# PROGRAM                        STATUS
---------- ---------- ------------------------------ ------------------------
       159          5 sqlplus@dbserver (TNS V1-V3)   ACTIVE
 
SQL> alter system disconnect session '159,5' immediate;
alter system disconnect session '159,5' immediate
*
行1でエラーが発生しました。:
ORA-00031: セッションは強制終了されます。
 
SQL> select sid, serial#, program, status from v$session where client_identifier ='my_id';
 
       SID    SERIAL# PROGRAM                        STATUS
---------- ---------- ------------------------------ ------------------------
       159          5 sqlplus@dbserver (TNS V1-V3)   KILLED
                                                     ^^^^^^

セッションA

もちろん変化なし

セッションB / kill コマンド発動

SQL> select s.sid, s.serial#, s.program, p.spid, s.status
  2  from v$session s, v$process p
  3  where s.client_identifier = 'my_id' and p.addr = s.paddr;
 
       SID    SERIAL# PROGRAM                        SPID   STATUS
---------- ---------- ------------------------------ ------ ------------------------
       159          5 sqlplus@dbserver (TNS V1-V3)   4104   KILLED
SQL>
SQL> host kill -9 4104
SQL>

セッションA

SQL> begin
  2      dbms_session.set_identifier('my_id');
  3      dbms_lock.sleep(360);
  4  end;
  5  /
*
行1でエラーが発生しました。:
ORA-03113: 通信チャネルでend-of-fileが検出されました
 
/** メッセージも少し淡白 ***/
 


SESSION 関連

KILL SESSION or DISCONNECT SESSIONの関連トピックス

日本オラクル
■ 日本オラクル 株式会社
■ オラクルマスター資格 (オラクルマスターとは
■ Oracle のライセンスがわからない…
Oracle Direct (ネットで聞いても最後はここで要確認)