برای از بین بردن یک 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.
عالی بود
متشکرم