23 Ekim 2010 Cumartesi

CORRUPTED Olmuş UNDO Tablespace’ ini Drop Etmek



Rollback Segmentlerini Undo Tablespace’ i otomatik kendisi manage eder. Kimi durumlarda rollback segmentleri corrupt olabiliyor. Böyle bir durum oluştuğunda klasik yollardan undoyu drop – create etmek işe yaramıyor. Üstelik undodaki bu problem den dolayıda sürekli çoğu transaction hata almaya başlıyor. Bu durumu  düzeltmek aşağıdaki gibi bir yöntem izlememiz gerekiyor.

1- Database imizi tutarlı bir şekilde kapatıyoruz.

sqlplus “/as sysdba”
shutdown immediate

2- Database’ i pfile’ i kullanarak Mount ve Restrict modda açıyoruz.

STARTUP RESTRICT MOUNTpfile=C:\Oracle\10g\db_1\initorcl.ora
ORACLE instance started.
Total System Global Area 1620126452 bytes
Fixed Size 457460 bytes
Variable Size 545259520 bytes
Database Buffers 1073741824 bytes
Redo Buffers 667648 bytes
Database mounted.

3- Corrupt olmuş olan undo tablespace’ ine ait datafile’ i offline drop etmeye çalıştığımızda aşağıdaki hatayı alırız.

ALTER DATABASE DATAFILE 'K:\ORADATA\CRM\UNDOTBS2_02.DBF' OFFLINE DROP;
*
ERROR at line 1:
ORA-01548: active rollback segment ‘_SYSSMU11$’ found, terminate dropping tablespace

Veya

DROP TABLESPACE undotbs2 INCLUDING CONTENTS AND DATAFILES ;
*
ERROR at line 1:
ORA-01548: active rollback segment ‘_SYSSMU11$’ found, terminate dropping tablespace

4- Aşağıdaki scripti kullanarak kaç tane rollback segmenti corrupt olmuş ise tespit etmemiz gerekiyor.

select segment_name,
                           status,
                           tablespace_name
   from dba_rollback_segs
   where status='NEEDS RECOVERY';

SEGMENT_NAME STATUS TABLESPACE_NAME
—————————— —————- —————–
_SYSSMU11$ NEEDS RECOVERY UNDOTBS2
_SYSSMU12$ NEEDS RECOVERY UNDOTBS2
_SYSSMU13$ NEEDS RECOVERY UNDOTBS2
_SYSSMU14$ NEEDS RECOVERY UNDOTBS2
_SYSSMU15$ NEEDS RECOVERY UNDOTBS2
_SYSSMU16$ NEEDS RECOVERY UNDOTBS2
_SYSSMU17$ NEEDS RECOVERY UNDOTBS2
_SYSSMU18$ NEEDS RECOVERY UNDOTBS2
_SYSSMU19$ NEEDS RECOVERY UNDOTBS2
_SYSSMU20$ NEEDS RECOVERY UNDOTBS2

5-  BU satırları pfile içerisine corrupt_rollback_segments parametresini kullanarak ekliyoruz.

*._corrupted_rollback_segments =('_SYSSMU11$','_SYSSMU12$','_SYSSMU13$','_SYSSMU14$','_SYSSMU15$','_SYSSMU16$','_SYSSMU17$','_SYSSMU18$','_SYSSMU19$','_SYSSMU20$')

*. undo_management=AUTO  parametresini # ‘ leyerek bu disable hale getiriyoruz.

Database’ i tekrar kapatıyoruz.

Shutdown immediate

Make sure you uncomment “undo_management=AUTO”, and specify you want to use UNDOTBS1 as undo tablespace.

6,  Tekrar aynı yöntemle start ediyoruz.

STARTUP RESTRICT MOUNTpfile=C:\Oracle\10g\db_1\initorcl.ora

7.  Corrupt olmuş rollback segmentlerini drop ediyoruz.

drop rollback segment "_SYSSMU11$";
Rollback segment dropped.

drop rollback segment "_SYSSMU20$";
Rollback segment dropped.

8- Aşağıdaki scriptle son durumu tekrar kontrol edebiliriz.

select segment_name,status,tablespace_name from dba_rollback_segs;

SEGMENT_NAME STATUS TABLESPACE_NAME
—————————— —————- —————
SYSTEM ONLINE SYSTEM
_SYSSMU2$ ONLINE UNDOTBS1
_SYSSMU3$ ONLINE UNDOTBS1
_SYSSMU4$ ONLINE UNDOTBS1
_SYSSMU5$ ONLINE UNDOTBS1
_SYSSMU6$ ONLINE UNDOTBS1
_SYSSMU7$ ONLINE UNDOTBS1
_SYSSMU8$ ONLINE UNDOTBS1
_SYSSMU9$ ONLINE UNDOTBS1
_SYSSMU10$ ONLINE UNDOTBS1
_SYSSMU21$ ONLINE UNDOTBS1

9-  Şimdi ise corrupt olmuş olan undo tablespace’ inden kurtulma zamanı,

drop TABLESPACE UNDOTBS2;

10-  Sonrasında kendimize yeni bir undo tablespace’ i create edebiliriz.

CREATE UNDO TABLESPACE UNDOTBS1 DATAFILE 'c:\oradata\orcl\UNDOTBS01.DBF' SIZE 100M ;

11- Yapılan bu değişikliği pfile’ e yazmamız gerekiyorki açılışda artık undo tablespace’ i olarak bunu görebilsin,

ALTER SYSTEM SET undo_tablespace = UNDOTBS1  scope=SPFILE;

12- Pfile’ e eklemiş olduğumuz aşağıdaki satırlarıda artık kaldırabiliriz.

Remove the following line from pfile

_corrupted_rollback_segments =('_SYSSMU11$','_SYSSMU12$','_SYSSMU13$','_SYSSMU14$','_SYSSMU15$','_SYSSMU16 $','_SYSSMU17$','_SYSSMU18$','_SYSSMU19$','_SYSSMU20$')

Ve son olarak undo_management değerinide aktif ederek (satırın başına koymuş olduğumuz # kaldırıyoruz)

undo_management=AUTO
undo_retention=10800
undo_tablespace=UNDOTBS1

13-  Database’ i kapatıyoruz.

shutdown immediate;

14- tekrar açıyoruz.

splplus “/as sysdba”
STARTUP RESTRICT MOUNTpfile=C:\Oracle\10g\db_1\initorcl.ora

ORACLE instance started.
Total System Global Area 1620126452 bytes
Fixed Size 457460 bytes
Variable Size 545259520 bytes
Database Buffers 1073741824 bytes
Redo Buffers 667648 bytes
Database mounted.
Database opened.

Hiç yorum yok: