ESC را فشار دهید تا بسته شود

زمیوس آموزش، یادگیری و سرگرمی

آموزش Kill کردن Session در Oracle؛ بستن فوری نشست‌های مزاحم

گاهی یک 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، به این دو مقدار نیاز دارید:

  • SID
  • SERIAL#
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 <SPID>

				
			

در صورت بی‌نتیجه بودن:

				
					kill -9 <SPID>

				
			

استفاده از 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 را به آخرین مرحله موکول کنید.

سؤالی درباره این مقاله داری؟

اگر نکته‌ای در این مقاله برات مبهم بود یا خواستی بیشتر بدونی، همین حالا برام بنویس تا دقیق و صمیمی پاسخت رو بدم — مثل یه گفت‌وگوی واقعی 💬

برو به صفحه پرسش و پاسخ

میثم راد

من یه برنامه نویسم که حسابی با دیتابیس اوراکل رفیقم! از اونایی ام که تا چیزی رو کامل نفهمم،ول کن نیستم، یادگرفتن برام مثل بازیه، و نوشتن اینجا کمک می کنه تا چیزایی که یاد گرفتم رو با بقیه به شریک بشم، با هم پیشرفت کنیم.

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

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