بررسی روشهای خاتمه دادن به یک session

برای از بین بردن یک Session و یا به عبارت دیگر kill session، می توان از دستورات مختلفی در سطح بانک و یا سیستم عامل استفاده کرد که در ادامه به بررسی تعدادی از این دستورات خواهیم پرداخت.

دستور ALTER SYSTEM KILL SESSION

رایج ترین روش برای از بین بردن یک session، استفاده از دستور ALTER SYSTEM KILL SESSION می باشد. برای استفاده از این دستور، ابتدا باید مشخصات sid و #serial مربوط به session را از ویوی v$session و یا gv$session مشخص کرد و سپس با کمک این دستور(alter system kill session)، به session مربوطه خاتمه داد:

select sid,serial# from v$session;

ALTER SYSTEM KILL SESSION ‘sid,serial#’

مثال زیر را ببینید:

کاربری از طریق sqlplus به بانک متصل شده است که مشخصات session مربوط به ان را در دستور زیر می بینید:

sqlplus  “/as sysdba”

select sid,serial#,STATUS from v$session l where l.PROGRAM like ‘sqlplus%’;

SID SERIAL#

STATUS

259

16563

INACTIVE

در این session، اطلاعاتی در جدول tbl1 درج می شود(بدون انجام commit):

SQL> insert into tbl1(LAST_NAME) values(‘USEFZADEH’);

1 row created.

مشاهده وضیعت تراکنش مربوط به این session:

select used_ublk,s.SID,s.SERIAL# from v$transaction l,v$session s where s.TADDR=l.ADDR;

USED_UBLK SID SERIAL#
1 259 16563

در همین حال، قصد داریم تا با دستور زیر، به این session خاتمه دهیم:

 

SQL> ALTER SYSTEM KILL SESSION ‘259,16563’;

System altered

با اجرای این دستور، پیامهای زیر در alert log قابل مشاهده می باشند:

–in alert log

2018-05-05T17:48:44.369645+04:30

KILL SESSION for sid=(259, 16563):

  Reason = alter system kill session

  Mode = KILL SOFT -/-/-

  Requestor = USER (orapid = 91, ospid = 19235, inst = 1)

  Owner = Process: USER (orapid = 90, ospid = 19200)

  Result = ORA-0

 

همچنین وضیعت session و transaction را مجددا بررسی می کنیم:

select sid,serial#,STATUS from v$session l where l.PROGRAM like ‘sqlplus%’;

SID SERIAL# STATUS
259 16563 KILLED

 

SQL> select used_ublk,s.SID,s.SERIAL# from v$transaction l,v$session s where s.TADDR=l.ADDR;

no rows selected

همانطور که می بینید، session در وضیعت KILLED قرار گرفته و تراکنش هم rollback شده ولی ظاهرا هنوز پروسس مربوط به ان، از بین نرفته است. با دستور زیر، شماره پروسس مربوطه را مشخص می کنیم:

select  p.spid from v$process p , v$session s where p.addr =s.paddr and s.SID=’259’ and s.SERIAL#=’16563’;

19200

این پروسس در محیط سیستم عامل هم قابل مشاهده می باشد:

 [root@hkm6 ~]# ps –eaf|grep 19200

oracle   19200 19199  0 17:45 ?        00:00:00 oracleusefdb18 (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))

 

برای از بین بردن این پروسس، می توان به صورت سسیتم عاملی اقدام کرد:

[root@hkm6 ~]# kill -9 19200

با انجام این کار، اثری از این session باقی نخواهد ماند:

select  p.spid from v$process p , v$session s where p.addr =s.paddr and s.SID=’259’ and s.SERIAL#=’16563’;

no rows selected

نتیجه انکه، استفاده از دستور alter system kill session(بدون هیچ پارامتر دیگر)، سبب خواهد شد تا session مربوطه در وضیعت killed قرار بگیرد(به عبارت دیگر، از session درخواست می شود تا خودش را kill کند) همچنین تراکنش مربوط به ان، rollback خواهد شد و منابع قفل شده توسط این session، آزاد می شود ولی کماکان پروسس مربوط به این session، در حالت اجرا باقی خواهد ماند.

عبارت IMMEDIATE

پارامتر IMMEDIATE در دستور alter system kill session، سبب از بین رفتن session به همراه پروسس مربوط به ان خواهد شد:

ALTER SYSTEM KILL SESSION ‘sid,serial#’ IMMEDIATE;

با اجرای این دستور، از بین رفتن سیستم عاملی پروسسها را می توان در alert log مشاهده کرد:

ALTER SYSTEM KILL SESSION ‘13,33000’ IMMEDIATE;

System altered.

–in alert log

2018-05-05T18:00:59.645400+04:30

Process termination requested for pid 20511 [source = rdbms], [info = 2] [request issued by pid: 20560, uid: 54321]

2018-05-05T18:00:59.696280+04:30

KILL SESSION for sid=(13, 33000):

  Reason = alter system kill session

  Mode = KILL HARD SAFE -/-/-

  Requestor = USER (orapid = 92, ospid = 20560, inst = 1)

  Owner = Process: USER (orapid = 8, ospid = 20511)

  Result = ORA-0

 

نکته 1: اجرای این دستور(kill session immediate) برای یک Session فعال(در حال انجام عملیات DMLای)، خطای زیر را دربرخواهد داشت البته همراه با این پیغام، به session خاتمه داده خواهد شد:

ORA-00031: session marked for kill

 

برای از بین بردن یک session در محیط کلاستر، می توان از ویوی gv$session به همراه دستور kill session با فرمت زیر استفاده کرد:

select sid,serial#,inst_id from gv$session;

ALTER SYSTEM KILL SESSION ‘sid,serial#,@inst_id’ IMMEDIATE;

مثال: از بین بردن تمامی sessionهایی که با sqlplus در نود دوم لاگین کرده اند:

–in node 1:

select ‘ALTER SYSTEM KILL SESSION ‘ ||’’’’||sid|| ‘,’ ||serial#||’,@’ || inst_id||’’’;’ from gv$session  where PROGRAM like ‘sqlplus%’;

SQL> ALTER SYSTEM KILL SESSION ‘5525,46099,@2’ IMMEDIATE;

System altered

–in alert log(node 2)

Sat May 05 18:22:55 2018

Immediate Kill Session#: 5525, Serial#: 46099

Immediate Kill Session: sess: 0x2443405070  OS pid: 6304

 

دستور ALTER SYSTEM DISCONNECT SESSION

این دستور امکان از بین بردن session را به دو صورت بعد از انجام تراکنش و یا به صورت فوری امکان پذیر می سازد:

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

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

استفاده از عبارت POST_TRANSACTION سبب خواهد شد تا عملیات kill session به بعد از اتمام تراکنش معکول شود به عبارت دیگر، KILL SOFT DISCONNECT رخ خواهد داد:

–session 1:

SQL> insert into tbl1(LAST_NAME) values(‘USEFZADEH’);

1 row created.

SQL> select ‘ALTER SYSTEM DISCONNECT SESSION ‘ ||’’’’||sid|| ‘,’ ||serial#||’’’ POST_TRANSACTION;’ from v$session where sid=SYS_CONTEXT(‘USERENV’,’SID’);

ALTER SYSTEM DISCONNECT SESSION ‘138,24054’ POST_TRANSACTION;

–session 2

SQL> ALTER SYSTEM DISCONNECT SESSION ‘138,24054’ POST_TRANSACTION;

System altered.

–session 1:

SQL> commit;

Commit complete.

SQL> select sysdate from dual;

ORA-00028: your session has been killed

همچنین استفاده از این دستور، سبب از بین رفتن پروسس در سطح سیستم عامل هم خواهد شد و نیازی به از بین بردن پروسس مربوطه در سطح سیستم عامل نخواهیم داشت:

2018-05-05T17:19:46.079445+04:30

KILL SESSION for sid=(138, 24054):

  Reason = alter system disconnect session

  Mode = KILL SOFT DISCONNECT/POST_TXN/-

  Requestor = USER (orapid = 90, ospid = 17596, inst = 1)

  Owner = Process: USER (orapid = 89, ospid = 17444)

  Result = ORA-0

استفاده از عبارت immediate در دستور ALTER SYSTEM DISCONNECT SESSION، سبب rollback شدن عملیات و از بین رفتن فوری sessionها خواهد شد:

SQL> ALTER SYSTEM DISCONNECT SESSION ‘138,41515’ IMMEDIATE ;

System altered.

SQL> commit;

ORA-03135: connection lost contact

Process ID: 17648

Session ID: 138 Serial number: 41515

از بین رفتن پروسس 17648:

 

KILL SESSION for sid=(138, 41515):

  Reason = alter system disconnect session

  Mode = KILL HARD SAFE DISCONNECT/-/-

  Requestor = USER (orapid = 90, ospid = 17596, inst = 1)

  Owner = Process: USER (orapid = 89, ospid = 17648)

  Result = ORA-0

دستور oradebug

برای خاتمه دادن به یک session، می توان از دستور ordebug هم بهره گرفت. در ادامه با کمک این دستور، sessionای با sid شماره 383 را از بین می بریم:

select  p.spid from v$process p , v$session s where p.addr =s.paddr and s.SID=’383′ and s.SERIAL#=’32126′;

4815

برای خاتمه دادن به این session، در ابتدا باید پروسس مربوط به این session را با کمک پارامتر setospid برای دستور oradebug تنظیم کرد:

SQL> oradebug setospid 4815;           

Oracle pid: 91, Unix process pid: 4815, image: oracle@hkm6 (TNS V1-V3)

سپس دستور زیر را اجرا نمود:

SQL> oradebug event immediate crash;

ORA-00072: process “Unix process pid: 4815, image: oracle@hkm6 (TNS V1-V3)” is not active

برای از بین بردن بقایای این session، می توان پروسس PMON را فراخواند:

select PID from v$process where pname =’PMON’;

2

SQL> oradebug wakeup 2;

Statement processed.

همچنین، به جای بیدار کردن پروسس PMON، با اولین فعالیت در sid=383، هم این اتفاق رخ خواهد داد:

SQL> update tbl1 set id = 10 where rownum <= 100000;

ORA-03135: connection lost contact

Process ID: 4815

Session ID: 383 Serial number: 32126

دستور orakill در ویندوز

برای خاتمه دادن به یک thread اوراکلی در محیط ویندوز، می توان از دستور orakill در سطح سیستم عامل استفاده کرد:

C:\Users\Administrator>orakill

Usage:  orakill sid thread

  where sid    = the Oracle instance to target

        thread = the thread id of the thread to kill

  The thread id should be retrieved from the spid column of a query such as:

        select spid, osuser, s.program from   v$process p, v$session s where p.addr=s.paddr

همانطور که راهنمای این دستور نشان می دهد، قبل از استفاده از این دستور، باید از دو ویوی v$process و v$session برای یافتن thread مورد نظر استفاده کرد:

SQL> select spid, osuser, s.program from v$process p, v$session s where p.addr=s

.paddr and s.program like ‘%sqlplus%’;

SPID                     OSUSER               PROGRAM

———               ————–       ——————–

4504     WINV3\Administrator   sqlplus.exe

 

حال با کمک orakill، سیگنال kill را برای پروسس 4504 ارسال می کنیم:

orakill <instance_name> <spid>

orakill prim 4504

Kill of thread id 4504 in instance prim successfully signalled.

ارائه خدمات مشاوره ، پشتیبانی و نصب و راه اندازی پایگاه داده اوراکل در سراسر کشور...................... تلفن: 09128110897 ایمیل:vahidusefzadeh@gmail.com

Comments (2)

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *