
گاهی یک Session در Oracle باعث ایجاد Lock، اجرای SQL سنگین، مصرف منابع یا متوقف شدن عملیات سایر کاربران میشود.
در این شرایط میتوان Session را با دستورهای مدیریتی Oracle قطع کرد.
این آموزش شامل دستورات کاربردی برای هر دو محیط Single Instance و Oracle RAC است.
برای اجرای این دستورات معمولاً به دسترسی
ALTER SYSTEMیا نقشDBAنیاز دارید
اگر دیتابیس Oracle کند شده، تعداد اتصالها افزایش پیدا کرده یا میخواهید بدانید چه کاربرانی به دیتابیس متصل هستند، اولین قدم بررسی Sessionهای فعال Oracle است.
پیشنهاد می کنم این مقاله زیر رو حتما مطالعه کنی.
در این مقاله شما می خوانید
پیدا کردن Session مزاحم
Single Instance
SELECT
sid,
serial#,
username,
status,
machine,
program,
sql_id,
event
FROM v$session
WHERE type = 'USER'
ORDER BY logon_time DESC;
برای اجرای موفق دستور Kill، به این دو مقدار نیاز دارید:
SIDSERIAL#
Oracle RAC
SELECT
inst_id,
sid,
serial#,
username,
status,
machine,
program,
sql_id,
event
FROM gv$session
WHERE type = 'USER'
ORDER BY inst_id, logon_time DESC;
در RAC شناسایی Session با ترکیب زیر انجام میشود:
INST_ID + SID + SERIAL#
مشاهده SQL در حال اجرای Session
Single Instance
SELECT
s.sid,
s.serial#,
s.username,
s.sql_id,
q.sql_text
FROM v$session s
LEFT JOIN v$sql q
ON q.sql_id = s.sql_id
WHERE s.sid = 123;
Oracle RAC
SELECT
s.inst_id,
s.sid,
s.serial#,
s.username,
s.sql_id,
q.sql_text
FROM gv$session s
LEFT JOIN gv$sql q
ON q.inst_id = s.inst_id
AND q.sql_id = s.sql_id
WHERE s.inst_id = 2
AND s.sid = 123;
قبل از Kill، بهتر است USERNAME، MACHINE، PROGRAM و SQL_ID را بررسی کنید تا Session اشتباهی قطع نشود.
Kill کردن Session
Single Instance
دستور استاندارد:
ALTER SYSTEM KILL SESSION 'SID,SERIAL#' IMMEDIATE;
مثال:
ALTER SYSTEM KILL SESSION '123,45678' IMMEDIATE;
ALTER SYSTEM DISCONNECT SESSION '123,45678' IMMEDIATE;
Oracle RAC
در RAC حتماً INST_ID را وارد کنید:
ALTER SYSTEM KILL SESSION 'SID,SERIAL#,@INST_ID' IMMEDIATE;
مثال:
ALTER SYSTEM KILL SESSION '123,45678,@2' IMMEDIATE;
ALTER SYSTEM DISCONNECT SESSION '123,45678,@2' IMMEDIATE;
در این مثال Session موردنظر روی Instance شماره ۲ قرار دارد.
پیدا کردن Session ایجادکننده Lock
Single Instance
SELECT
w.sid AS waiting_sid,
w.serial# AS waiting_serial,
h.sid AS holding_sid,
h.serial# AS holding_serial,
h.username AS holding_username,
h.machine,
h.program
FROM v$session w
JOIN v$session h
ON h.sid = w.blocking_session
WHERE w.blocking_session IS NOT NULL;
برای آزاد کردن Lock معمولاً باید Session نگهدارنده Lock یعنی HOLDING_SID را قطع کنید:
ALTER SYSTEM DISCONNECT SESSION 'HOLDING_SID,HOLDING_SERIAL' IMMEDIATE;
Oracle RAC
SELECT
w.inst_id AS waiting_inst_id,
w.sid AS waiting_sid,
h.inst_id AS holding_inst_id,
h.sid AS holding_sid,
h.serial# AS holding_serial,
h.username AS holding_username,
h.machine,
h.program
FROM gv$session w
JOIN gv$session h
ON h.inst_id = w.blocking_instance
AND h.sid = w.blocking_session
WHERE w.blocking_session IS NOT NULL;
سپس Session نگهدارنده Lock را با این فرمت قطع کنید:
ALTER SYSTEM DISCONNECT SESSION
'HOLDING_SID,HOLDING_SERIAL,@HOLDING_INST_ID'
IMMEDIATE;
بررسی وضعیت Session بعد از Kill
Single Instance
SELECT
sid,
serial#,
username,
status,
sql_id,
event
FROM v$session
WHERE sid = 123;
Oracle RAC
SELECT
inst_id,
sid,
serial#,
username,
status,
sql_id,
event
FROM gv$session
WHERE inst_id = 2
AND sid = 123;
اگر Session با وضعیت KILLED دیده شود، یعنی Oracle آن را برای خاتمه علامتگذاری کرده است.
حذف کامل آن ممکن است کمی زمان ببرد؛ مخصوصاً اگر Session درگیر Rollback یا عملیات I/O باشد.
پیدا کردن Process سیستمعامل
Single Instance
SELECT
s.sid,
s.serial#,
p.spid,
s.username,
s.machine,
s.program
FROM v$session s
JOIN v$process p
ON p.addr = s.paddr
WHERE s.sid = 123;
Oracle RAC
SELECT
s.inst_id,
s.sid,
s.serial#,
p.spid,
s.username,
s.machine,
s.program
FROM gv$session s
JOIN gv$process p
ON p.inst_id = s.inst_id
AND p.addr = s.paddr
WHERE s.inst_id = 2
AND s.sid = 123;
در صورت باقی ماندن Session و با دسترسی مدیر سیستمعامل:
kill -15
در صورت بینتیجه بودن:
kill -9
استفاده از kill -9 آخرین راهحل است.
قبل از اجرا، حتماً مطمئن شوید SPID متعلق به Session موردنظر است و Processهای اصلی Oracle مانند PMON یا SMON نیست.
خطاهای رایج اوراکل
ORA-00030
ORA-00030: User session ID does not exist
یعنی Session قبلاً قطع شده یا SID، SERIAL# یا INST_ID اشتباه است.
ORA-00031
ORA-00031: session marked for kill
یعنی Session قبلاً برای Kill علامتگذاری شده است. معمولاً باید کمی صبر کنید و وضعیت آن را دوباره بررسی کنید.
سوالات متداول درباره Kill کردن Session در Oracle
برای بستن یک Session ابتدا باید شناسههای SID و SERIAL# آن را از اطلاعات Sessionهای دیتابیس پیدا کنید.
سپس با دستور Kill یا Disconnect، اتصال Session را قطع کنید. قبل از انجام این کار بهتر است نام کاربر، سیستم متصل، برنامه و SQL در حال اجرا بررسی شود تا Session اشتباهی بسته نشود.
هر دو روش برای قطع Session استفاده میشوند، اما رفتار آنها کمی متفاوت است.
دستور Kill Session، Session را برای خاتمه علامتگذاری میکند؛ درحالیکه Disconnect Session مستقیماً اتصال کاربر را قطع میکند.
در بیشتر مواقع هر دو نتیجه مشابهی دارند، اما Disconnect Session برای قطع اتصال Session گزینه مناسبتری محسوب میشود.
نمایش وضعیت KILLED به این معناست که Oracle Session را برای حذف علامتگذاری کرده، اما فرآیند مربوط به آن هنوز کاملاً خاتمه نیافته است.
اگر Session دارای تراکنش فعال، عملیات طولانی، Rollback یا انتظار در سطح سیستمعامل باشد، حذف کامل آن ممکن است مدتی طول بکشد.
در چنین شرایطی نباید بلافاصله چند بار دستور Kill را اجرا کرد؛ ابتدا باید وضعیت Process و تراکنش آن بررسی شود.
بله. در Single Instance برای شناسایی Session معمولاً SID و SERIAL# کافی است؛ اما در Oracle RAC، چون چند Instance فعال هستند، باید INST_ID نیز مشخص شود.
بنابراین قبل از قطع Session در RAC باید مطمئن شوید Session روی کدام Instance اجرا میشود. در غیر این صورت ممکن است Session اشتباهی هدف قرار بگیرد یا دستور با خطا مواجه شود.
جمعبندی
- Session را با
SIDوSERIAL#پیدا کنید. - در RAC مقدار
INST_IDرا نیز بررسی کنید. - کاربر، ماشین و SQL در حال اجرا را کنترل کنید.
- اگر مشکل Lock است، Session نگهدارنده Lock را قطع کنید.
- وضعیت Session را بعد از Kill بررسی کنید.
- استفاده از
kill -9را به آخرین مرحله موکول کنید.
سؤالی درباره این مقاله داری؟
اگر نکتهای در این مقاله برات مبهم بود یا خواستی بیشتر بدونی، همین حالا برام بنویس تا دقیق و صمیمی پاسخت رو بدم — مثل یه گفتوگوی واقعی 💬
برو به صفحه پرسش و پاسخ
دیدگاهتان را بنویسید