[Oracle] KILLEDとマークされたセッションのサーバプロセスをOSで切断する

ブログ » Oracle KILLEDとマークされたセッションのサーバプロセスをOSで切断する

25 May 2014 02:46公開

サーバプロセスはalter system kill session 'sid,serial'で切断されてから、まずKILLEDとマークされます。PMONでクリアされるまで、結構時間は経ちます。この間たくさんのリソースは開放されないままです。しかし、この状態では普通のV$SESSIONとV$PROCESSの結合はSPIDの情報を抽出することができなくなります。今回はこの状態でサーバプロセスの切断方法を紹介します。

方法

まず方法を紹介しましょう。下記のSQLでSPIDを洗い出してから、OSのkill -9で切断することができます。

SQL> select * from v$process where addr in (
  2    select addr from v$process p where pid <> 1
  3    minus
  4    select paddr from v$session s);
 
SPID         
------------ 
21891        
 
SQL> host
 
$ kill -9 21891
$ exit

詳細説明

オラクルでは、問題のあるサーバプロセスに対して、alter system kill session 'sid,serial'で切断することができます。以下kill session操作と呼びます。
しかし、このようなセッションは、まずKILLEDとマークされもので、次のPMONでクリアされるまで、結構時間は経ちます。この間セッションの割当されたたくさんのリソースは開放されないままです。
そして、この状態ではv$sessionのpaddrはpidが1の特定のサーバプロセスに変更されます。複数のセッションが切断されるなら、同じPADDRに変更されることも確認できます。
ですから、普通のV$SESSIONとV$PROCESSの結合はSPIDの情報を抽出することができなくなります。(select * from v$session s, v$process p where s.paddr = p.addr)

SQL> set lin 150
SQL> set pages 9999
 
SQL> select * from v$session where osuser like 'myosusr%';
 
SADDR                   SID    SERIAL#     AUDSID PADDR                 USER# USERNAME                          COMMAND    OWNERID TADDR
---------------- ---------- ---------- ---------- ---------------- ---------- ------------------------------ ---------- ---------- ----------------
LOCKWAIT         STATUS   SERVER       SCHEMA# SCHEMANAME                     OSUSER                         PROCESS
---------------- -------- --------- ---------- ------------------------------ ------------------------------ ------------
MACHINE                                                          TERMINAL                       PROGRAM
---------------------------------------------------------------- ------------------------------ ------------------------------------------------
TYPE       SQL_ADDRESS      SQL_HASH_VALUE SQL_ID        SQL_CHILD_NUMBER PREV_SQL_ADDR    PREV_HASH_VALUE PREV_SQL_ID   PREV_CHILD_NUMBER
---------- ---------------- -------------- ------------- ---------------- ---------------- --------------- ------------- -----------------
PLSQL_ENTRY_OBJECT_ID PLSQL_ENTRY_SUBPROGRAM_ID PLSQL_OBJECT_ID PLSQL_SUBPROGRAM_ID MODULE                                           MODULE_HASH
--------------------- ------------------------- --------------- ------------------- ------------------------------------------------ -----------
ACTION                           ACTION_HASH CLIENT_INFO                                                      FIXED_TABLE_SEQUENCE ROW_WAIT_OBJ#
-------------------------------- ----------- ---------------------------------------------------------------- -------------------- -------------
ROW_WAIT_FILE# ROW_WAIT_BLOCK# ROW_WAIT_ROW# LOGON_TI LAST_CALL_ET PDM FAILOVER_TYPE FAILOVER_M FAI RESOURCE_CONSUMER_GROUP          PDML_STA PDDL_STA
-------------- --------------- ------------- -------- ------------ --- ------------- ---------- --- -------------------------------- -------- --------
PQ_STATU CURRENT_QUEUE_DURATION CLIENT_IDENTIFIER                                                BLOCKING_SE BLOCKING_INSTANCE BLOCKING_SESSION
-------- ---------------------- ---------------------------------------------------------------- ----------- ----------------- ----------------
      SEQ#     EVENT# EVENT
---------- ---------- ----------------------------------------------------------------
P1TEXT                                                                   P1 P1RAW
---------------------------------------------------------------- ---------- ----------------
P2TEXT                                                                   P2 P2RAW
---------------------------------------------------------------- ---------- ----------------
P3TEXT                                                                   P3 P3RAW            WAIT_CLASS_ID WAIT_CLASS#
---------------------------------------------------------------- ---------- ---------------- ------------- -----------
WAIT_CLASS                                                        WAIT_TIME SECONDS_IN_WAIT STATE
---------------------------------------------------------------- ---------- --------------- -------------------
SERVICE_NAME                                                     SQL_TRAC SQL_T SQL_T
---------------------------------------------------------------- -------- ----- -----
000000015B584848        232      14572    4968481 000000015F5171B0         61 APPLDBUSER                              0 2147483644
                 KILLED   PSEUDO            61 APPLDBUSER                     myosusr-123456789              4800:9064
MY-DOMAIN\MYDBAPC                                                MYDBAPC                        ob9.exe
USER       00                            0                                000000015D2B7DB8      1382851420 23w54b996t8uw                 1
                                                                                    ob9.exe                                            736228983
                                           0                                                                             263294156            37
             1           41930             0 14-05-23       151445 NO  NONE          NONE       NO                                   DISABLED ENABLED
ENABLED                       0                                                                  NO HOLDER
       480        259 SQL*Net message from client
driver id                                                        1413697536 0000000054435000
#bytes                                                                    1 0000000000000001
                                                                          0 00                  2723168908           6
Idle                                                                      0          151445 WAITING
mydb01                                                           DISABLED FALSE FALSE
 
Elapsed: 00:00:00.02
SQL> select * from v$session s, v$process p where s.paddr = p.addr and s.osuser like 'myosusr%';
 
no rows selected
 
Elapsed: 00:00:00.01
SQL>

この状態で、外部結合でリレーションを確認することができます。

SELECT s.username,s.status,
x.ADDR,x.KSLLAPSC,x.KSLLAPSN,x.KSLLASPO,x.KSLLID1R,x.KSLLRTYP,
decode(bitand (x.ksuprflg,2),0,null,1)
FROM x$ksupr x,v$session s
WHERE s.paddr(+)=x.addr
and bitand(ksspaflg,1)!=0;

また、少しシンプルの形はv$sessionのpaddrとv$processのaddrの違いで、KILLED状態のサーバプロセスを確認することができます。

SQL> select addr from v$process p where pid <> 1
  2  minus
  3  select paddr from v$session s
  4  ;
 
ADDR
----------------
000000015A47B8A0
 
Elapsed: 00:00:00.01
SQL> select * from v$process where addr in (
  2    select addr from v$process p where pid <> 1
  3    minus
  4    select paddr from v$session s);
 
ADDR                    PID SPID         USERNAME           SERIAL# TERMINAL                       PROGRAM
---------------- ---------- ------------ --------------- ---------- ------------------------------ ------------------------------------------------
TRACEID
------------------------------------------------------------------------------------------------------------------------------------------------------
B LATCHWAIT        LATCHSPIN        PGA_USED_MEM PGA_ALLOC_MEM PGA_FREEABLE_MEM PGA_MAX_MEM
- ---------------- ---------------- ------------ ------------- ---------------- -----------
000000015A47B8A0        189 21891        oracle                  17 UNKNOWN                        oracle@td-ssms
 
                                          732109       2151565          1048576     8377485
 
Elapsed: 00:00:00.22

次は簡単です。OSのkillコマンドでサーバプロセスをクリアします。ところで、killだけはクリアできません。kill -9が必要です。

SQL> host
$ export LANG=C
$ kill 21891
$ ps -ef | grep 21891
oracle   18867 18817  0 10:07 pts/5    00:00:00 grep 21891
oracle   21891     1  0 May23 ?        00:00:00 oraclemydb01 (LOCAL=NO)
$ kill -9 21891
$ ps -ef | grep 21891
oracle   18874 18817  0 10:08 pts/5    00:00:00 grep 21891
$ exit
exit

SQLPLUSに戻って、結果を確認することができます。

SQL> select * from v$session where osuser like 'myosusr%';
 
no rows selected
 
Elapsed: 00:00:00.01
SQL>

Reference:
http://wiki.myoa.tk/zh-blog:103

レーティング

rating: 0+x

コメント

Add a New Comment