در برخی موارد، ممکن است نیاز باشد که یک session در حال اجرا در Oracle Database را kill کنیم. این کار میتواند به دلایل مختلفی انجام شود، از جمله قفلهای طولانیمدت، مصرف بالای منابع، یا مشکلات برنامهنویسی. در این مقاله به نکات مهمی که باید در نظر گرفته شوند و مراحل kill کردن یک session یا برنامه در Oracle Database میپردازیم.
نکات مهم قبل از Kill کردن یک Session
-
بررسی میزان Undo: قبل از kill کردن یک session، باید میزان undo آن را بررسی کنید. اگر session مورد نظر مقدار زیادی undo دارد، kill کردن آن ممکن است زمانبر باشد و بر عملکرد کلی سیستم تأثیر بگذارد.
-
زمان پیک بار: بررسی کنید که آیا سیستم در زمان پیک بار قرار دارد یا نه. Kill کردن یک session در زمان پیک بار میتواند به کندی سیستم منجر شود و تأثیر منفی بر عملکرد سایر کاربران داشته باشد.
-
بررسی ارتباطات: اطمینان حاصل کنید که kill کردن session منجر به قطع ارتباطات مهم نشود. برای مثال، یک session ممکن است در حال اجرای تراکنشهای حیاتی باشد.
مراحل Kill کردن یک Session در Oracle Database
1. شناسایی Session
ابتدا باید session مورد نظر را شناسایی کنید. برای این کار از جستجوی زیر استفاده کنید:
SELECT sid, serial#, username, program, status
FROM v$session
WHERE status = 'ACTIVE' and ...
;
دقت کنیم که باید چند پارامتر دیگر مثل ماشینی که در از آن آمده، نام کاربر، نام برنامه و ... را هم اضافه کنیم که دقیقا همان Session را پیدا کنیم.
2. بررسی Undo
برای بررسی میزان undo یک session میتوانید از جستجوی زیر استفاده کنید:
SELECT s.sid, s.serial#, s.username, t.used_urec, t.used_ublk
FROM v$session s
JOIN v$transaction t ON s.saddr = t.ses_addr
WHERE s.sid = :sid;
3. Kill کردن Session
برای kill کردن یک session از دستور زیر استفاده کنید:
ALTER SYSTEM KILL SESSION 'sid,serial#' IMMEDIATE;
Kill کردن Process در سطح سیستم عامل
اگر session در سطح دیتابیس kill نشد، میتوانید process مربوطه را در سطح سیستم عامل kill کنید. برای این کار ابتدا PID مربوط به session را پیدا کنید:
SELECT p.spid
FROM v$process p
JOIN v$session s ON p.addr = s.paddr
WHERE s.sid = :sid;
سپس در سیستم عامل، دستور زیر را اجرا کنید (در لینوکس/یونیکس):
kill -9 <PID>
نکته مهم دیگر اینکه اگر shared server کانفیگ کرده باشیم، کمی کارمون متفاوت میشه
پیدا کردن dispatcher
SELECT s.sid, s.serial#, p.spid as "PID", q.paddr as "Dispatcher PID"
FROM v$session s
JOIN v$queue q ON s.paddr = q.sid
JOIN v$process p ON q.paddr = p.addr
WHERE s.sid = :sid;
و بعد kill کردن اون و اگر نشد باید باز هم از طریق سیستم عامل اقدام کنیم.