همانطور که می دانید یکی از کارهای مهم 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 ایجاد شده را به طور دستی از بین برد:
- از طریق 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’;
- از طریق حذف سگمنت:
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’);
Comment (1)