SMON در یک نگاه

همانطور که می دانید یکی از کارهای مهم smon، پاک کردن temporary segmentها می باشد temporary segment در permanent tablespaceها با دستورات زیر ایجاد می شوند:

alter table … move

create table as

alter index … rebuild

بلافاصله بعد از اتمام این دستورات، نوع سگمنت از temporary به permanent تغییر خواهد کرد. البته اگر این دستورات با خطا متوقف شود، باید temporary segment ایجاد شده، پاک شود.

برای درک دقیق تر از نقشی که smon در این زمینه ایفا می کند، مرور سناریوی زیر می تواند مفید باشد:

ابتدا با تنظیم پارامتر event به صورت زیر، امکان تمیز کردن temporary segment را از smon می گیریم:

alter system set event=”10061 trace name context forever, level 10″ scope=spfile;

startup force

حال فرض کنید جدولی با حجم بسیار زیاد، در حال سازماندهی مجدد می باشد:

alter table usef_tbl move;

به صورت همزمان با دستور زیر، وضیعت temporary segment را مورد بررسی قرار می دهیم:

select   l.owner,l.segment_name,l.segment_type,l.bytes/1024/1024 from dba_segments l where l.segment_type=’TEMPORARY’

OWNER SEGMENT_NAME SEGMENT_TYPE L.BYTES/1024/1024
usef 1.1504 TEMPORARY 560

 

در همین حال که هنوز دستور قبلی به سرانجامی نرسیده، فردی دستور زیر را وارد می کند:

shutdown immediate;

بعد از استارت مجدد، دیده می شود که هنوز temporary segment خالی نشده است و به شکل قبلی باقیست:

select   l.owner,l.segment_name,l.segment_type,l.bytes/1024/1024 from dba_segments l where l.segment_type=’TEMPORARY’

OWNER SEGMENT_NAME SEGMENT_TYPE L.BYTES/1024/1024
usef 1.1504 TEMPORARY 560

 

به دو شیوه می توان temporary segment ایجاد شده را به طور دستی از بین برد:

  1. از طریق event:

ابتدا باید مشخص شود که این temp segment در کدام tbs قرار دارد:

select ts# from sys.ts$ where name = ‘USEF_TBS1’;

5

برای پاک کردن این temp segment، از دستور زیر استفاده می شود(شماره tbs را بعلاوه یک می شود):

alter session set events ‘immediate trace name DROP_SEGMENTS level 6’;

  1. از طریق حذف سگمنت:

SQL> exec DBMS_SPACE_ADMIN.TABLESPACE_VERIFY(‘USEF_TBS1’);

Segment را به عنوان سگمنت CORRUPT علامت می زنیم:

select ‘exec DBMS_SPACE_ADMIN.SEGMENT_CORRUPT(‘ || chr(39) || tablespace_name || chr(39) || ‘,’ || HEADER_FILE || ‘,’ || HEADER_BLOCK || ‘);’  from dba_segments where SEGMENT_TYPE like ‘TEMP%’ and tablespace_name = ‘USEF_TBS1’;

SQL> exec DBMS_SPACE_ADMIN.SEGMENT_CORRUPT(‘USEF_TBS1’,5,130);

در نهایت سگمنت خراب را پاک می کنیم:

select ‘exec DBMS_SPACE_ADMIN.SEGMENT_DROP_CORRUPT (‘ || chr(39) || tablespace_name || chr(39) || ‘,’ || HEADER_FILE || ‘,’ || HEADER_BLOCK || ‘);’ from dba_segments where SEGMENT_TYPE like ‘TEMP%’ and tablespace_name = ‘USEF_TBS1’;

SQL> exec DBMS_SPACE_ADMIN.SEGMENT_DROP_CORRUPT (‘USEF_TBS1’,5,130);

در نهایت data dictionary را بروزرسانی می کنیم:

SQL>exec DBMS_SPACE_ADMIN.TABLESPACE_VERIFY(‘USEF_TBS1’);

 

 

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد.