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.
plus “/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.