30 Ekim 2010 Cumartesi

Tablespace Doluluk Oranlarının Günlük Takibi


Merhaba, 

Database içerisinde kullanılan tablespace' lerin büyüklüklerinin takip edilmesi sistemin sağlıklı işlemesi açısından son derece kritik önem taşımaktadır.
Tablespace' lerin size' larını takip etmenin bir sürü yöntemi vardır. Bunlardan biri Enterprise Manager konsol Manage Metric linkinden (varolan metricleri edit de edebilirsiniz) tablepspace' ler ile ilgili size özel thresholds lar tanımlayabilirsiniz. Örneğin bir tablespace' in %85' i dolduğundan warning, %95' i dolduğunda da critical alert vermesini sağlayabilirsiniz. Belirttiğiniz bir şekilde bir case oluştuğunda mail, sms bile attırabilirsiniz. Yada benim gibi bu işi günlük olarak manuel takip ediyorsanız, size yardımcı olması açısından aşağıdaki bir procedür oluşturabilirsiniz. Bu procedür özetle hergün belli bir saatte çalışarak bir tabloya benim belirlemiş olduğum kriterlere ait bilgileri insert ediyor bende sadece o tabloyu select ederek kontrol ediyorum. Procedür aslında şunları yapıyor ;
 

1 - tablespace' lerin kullanım miktarlarını buluyor,
2 - tablespace' lerin free alanlarını buluyor,
3 - bulduğu bu değerleri bir tabloya tarih bilgisi ile birlikte insert ediyor,
 
4 - her bir tablespace için, günlük ne kadar free alan olması gerektiğini set ediyor, (bu değeri bir sefere mahsus biz belirliyoruz),
5 - o anki free alan ile bizim free olmasını istedimiz alan arasındaki farka bakıp datafile eklenipeklenmemesine kara veriyor.
 

Aşağıda bir örneğini oluşturmaya çalıştım. 

-- Öcelikle procedürümüzün dolduracağı tabloyu oluşturalım, 
CREATE TABLE KAMIL.TABLESPACE_KONTROL
(
  TABLESPACE_NAME   VARCHAR2(35 BYTE),
  GB_USED           NUMBER,
  GB_KULLANILAN     NUMBER,
  GB_FREE           NUMBER,
  PERCENT_USED      NUMBER,
  SDATE             DATE,
  TOLERANS_GB       NUMBER,
  AKSIYON           VARCHAR2(50 BYTE),
  GUNLUK_BUYUME_GB  NUMBER
) ;
 
Table created.


-- exception durumunda doldurulacak olan tabloyu oluşturalım, 
CREATE TABLE KAMIL.TABLESPACE_KONTROL_LOG
(
  TARIH  DATE,
  HATA   VARCHAR2(300 BYTE)
) ;
 
Table created.


-- procedürümüzü create edelim. 
--(birincisi, burada hangi user altına create ediyorsanız procedüre içerisinde kullanılan tablolara select etme hakkı vermeyi, ikinci olarak update cümlelerindeki tablespace' lerin isimlerini kendi sistemizdekiler ile değiştirmeyi unutmayın.) 


CREATE OR REPLACE PROCEDURE KAMIL.P_TABLESPACE_KONTROL(PAR_TARIH DATE DEFAULT TRUNC(SYSDATE)) IS
   SQL_ERROR_TEXT          VARCHAR2(1024);
   V_STRING                VARCHAR2(1024);
   CURSOR C1 IS
  select a.TABLESPACE_NAME tablepsace_name,
    a.gb gb_used,
    (a.gb - b.gb) gb_kullanılan,
    b.gb gb_free,
    round(((a.gb-b.gb)/a.gb)*100,2) percent_used,
    trunc(sysdate) sdate
from
    (select TABLESPACE_NAME,
        trunc(sum(Decode(BYTES/1024/1024/1024,BYTES/1024/1024/1024,BYTES/1024/1024/1024,0.00000001)),2) gb
        from     dba_data_files
        where  trunc((Decode(BYTES/1024/1024/1024,BYTES/1024/1024/1024,BYTES/1024/1024/1024,0.00000001)),2)> 0
        group     by TABLESPACE_NAME
 
       
 
        ) a,
    (select TABLESPACE_NAME,
        trunc(sum(Decode(BYTES/1024/1024/1024,BYTES/1024/1024/1024,BYTES/1024/1024/1024,0.0000000001)),2) gb
        from     dba_free_space
        group     by TABLESPACE_NAME) b
where     a.TABLESPACE_NAME=b.TABLESPACE_NAME ;
BEGIN
   FOR C1REC IN C1 LOOP
      BEGIN
        INSERT INTO KAMIL.TABLESPACE_KONTROL
        (tablespace_name,
         gb_used,
         gb_kullanilan,
         gb_free,
         percent_used,
         sdate)
        VALUES
        (C1REC.tablepsace_name,
        C1REC.gb_used,
        C1REC.gb_kullanilan,
        C1REC.gb_free,
        C1REC.percent_used,
        C1REC.sdate);
        EXCEPTION
         WHEN OTHERS THEN
            ROLLBACK;
            SQL_ERROR_TEXT := SQLERRM||' (1) p_tablespace_kontrol ';
            INSERT INTO kamil.tablespace_kontrol_LOG(TARIH, HATA)
               VALUES(PAR_TARIH,
                            SUBSTR(SQL_ERROR_TEXT,1,256));
            COMMIT;
       end;
   END LOOP;
insert into kamil.TABLESPACE_KONTROL_LOG (tarih, hata)  values (sysdate, 'işlendi');
COMMIT;
    begin
UPDATE kamil.tablespace_kontrol SET TOLERANS_GB = 0  WHERE TABLESPACE_NAME =  'UNDOTBS1'  and tolerans_gb is null;
UPDATE kamil.tablespace_kontrol SET TOLERANS_GB = 1  WHERE TABLESPACE_NAME =  'SYSAUX'  and tolerans_gb is null;
UPDATE kamil.tablespace_kontrol SET TOLERANS_GB = 10  WHERE TABLESPACE_NAME =  'USERS'  and tolerans_gb is null;
UPDATE kamil.tablespace_kontrol SET TOLERANS_GB = 0  WHERE TABLESPACE_NAME =  'TEMP'  and tolerans_gb is null;
UPDATE kamil.tablespace_kontrol SET TOLERANS_GB = 1  WHERE TABLESPACE_NAME =  'STUDY1'  and tolerans_gb is null;
UPDATE kamil.tablespace_kontrol SET TOLERANS_GB = 5  WHERE TABLESPACE_NAME =  'SMALL'  and tolerans_gb is null;
UPDATE kamil.tablespace_kontrol SET TOLERANS_GB = 5  WHERE TABLESPACE_NAME =  'RMAN_PROD'  and tolerans_gb is null;
UPDATE kamil.tablespace_kontrol SET TOLERANS_GB = 2  WHERE TABLESPACE_NAME =  'TEST'  and tolerans_gb is null;
commit;
UPDATE kamil.tablespace_kontrol SET AKSIYON = 'DATAFILE EKLE TOLERANSIN ALTINA DÜŞMÜŞ' WHERE gb_free < TOLERANS_GB AND AKSIYON IS NULL ;
UPDATE kamil.tablespace_kontrol SET AKSIYON = 'DATAFILE EKLEMEYE GEREK YOK' WHERE gb_free >= TOLERANS_GB AND AKSIYON IS NULL ;
commit;
update kamil.tablespace_kontrol z set gunluk_buyume_gb = (
SELECT (son_durum - onceki_durum) gunluk_buyume_gb
  FROM (SELECT tablespace_name, gb_kullanilan son_durum
          FROM tablespace_kontrol
         WHERE TRUNC (sdate) = TRUNC (SYSDATE)) a,
       (SELECT tablespace_name, gb_kullanilan onceki_durum
          FROM tablespace_kontrol
         WHERE TRUNC (sdate) = TRUNC (SYSDATE - 1)) b
     where a.tablespace_name = b.tablespace_name
and  z.tablespace_name = a.tablespace_name
and  z.tablespace_name = b.tablespace_name
)
where trunc(z.sdate) = trunc(sysdate);
commit;
   END;
 end;
/

Procedure created.


-- bir gün için tablomuzu dolduralım, 
exec KAMIL.P_TABLESPACE_KONTROL(sysdate) ;
PL/SQL procedure successfully completed.


-- Gelen değerleri select edelim, 
select * from kamil.tablespace_kontrol where sdate = trunc(sysdate)  ;  


-- log tablomuzu kontrol edelim, 
select * from tablespace_kontrol_log ;


Umarım faydalı olmuştur.


Kamil TÜRKYILMAZ

28 Ekim 2010 Perşembe

Datafile ‘ in adını Rename Etme & Pathini Değiştirme


Oracle server ürürünü kurarken genelde kurulum esnasında oracle tarafından ORACLE_BASE altına
set edilen oradata dizinine direk kurulum yapanlarınız mutlaka olmuştur. Ancak burası aynı zamanda ORACLE_HOME dizinide olduğundan genelde bu diskin size’ i dbf’ lerin barındırabilecek ölçüde olmadığından dolayı bunları taşımamız gerekebilir. Veya herhangi bir sebebden bir ötürü herhangi bir datafile’ i farklı bir disk üzerinde tutmaya karar verebilirsiniz. Bunun için aslında 2 yöntem var. Şimdi bunları sırasıyla açıklamaya çalışalım;

1) Eğer veritabanımız noarchivelog modda veya taşımak istediğiniz
datafile SYS, SYSAUX veya UNDO tablespace'ine ait ise bu taşıma işlemini veritabanı açıkken yapılamazsınız. Mutlaka database’ in kapatılması gerekmektedir.

SQL> SHUTDOWN IMMEDIATE

Database’ I kapattıkdan sonra OS komutlarıyla datafilelerin yerlerindeki değişiklikleri yaparız. Sonra Mount modda database’ I açarız.

SQL> STARTUP MOUNT

Sonra datafile’lerin yeni yerleri sisteme tanıtılır ve database Open moda alınır.

SQL> ALTER DATABASE RENAME FILE '/old_lokasyon/deneme01.dbf' TO'/new_lokasyon/deneme01.dbf';

SQL> ALTER DATABASE OPEN;

2) Eğer archivelog modda çalışıyor isek ce taşıyacağımız datafile’ ler sistem tablespace’ lerine ait değilse o zaman database’ I kapatmadan bu taşıma işlemini yapabiliriz.  İlk adımımız taşınacak datafile hangi tablespace’ e ait ise o tablespace’ I offline moda alıyoruz.

SQL> ALTER TABLESPACE deneme OFFLINE;

Tablespace oofline’ a alınması demek artık database tarafından hiçbir şekilde o tablespace’ e erişim olmaması anlamına gelir. Datafile’ I artık yeni yerine OS komutları ile taşıyabiliriz. Sonrasında tekrar tablespace’ i Online moda almamız gerekecek.

SQL> ALTER DATABASE RENAME FILE '/old_lokasyon/deneme01.dbf' TO'/new_lokasyon/deneme01.dbf';

SQL> ALTER TABLESPACE example ONLINE;

Aslında şu suruyu sorabilirsiniz datafile üzerinde işlem yapıyoruz peki neden datafile’ I değilde tablespace’ I offline moda alıyoruz. Bu sorunun cevabı evet haklısınız bu işlem için tablespace’ I değilde sadece ilgili datafile’ I offline moda alabilirsiniz ancak datafile online moda almadan önce mutlaka recover etmeniz gerekeceğinden yedeğinizin olduğundan mutlaka emin olmanız gerekecektir.

SQL> ALTER DATABASE DATAFILE '/old_lokasyon/dosya.dbf' OFFLINE;

Kopyalama sonrası:

SQL> ALTER DATABASE RENAME FILE  '/old_lokasyon/deneme01.dbf' TO'/new_lokasyon/deneme01.dbf';

SQL> RECOVER DATAFILE '/new_lokasyon/deneme01.dbf';

SQL> ALTER DATABASE DATAFILE '/new_lokasyon/deneme01.dbf';
 ONLINE;

Datafile’ i Offline moda alıpda işlem yapacaksınız backup son derece önemli.

Kamil TÜRKYILMAZ 



25 Ekim 2010 Pazartesi

Tablo ve Indexlerin Taşınması


Kullandığımız sistem içerisinde özelliklede kullanıcıların yoğun olduğu sistemlerde zaman zaman bazı tablo ve buna indexlerin yanlış tablespace’ lerde create edildiğini görürüz. System tablespace’ i buna iyi bir örnek olabilir aslında,

select * from dba_segments
where tablespace_name = 'SYSTEM'
and owner not in  ('SYS','SYSTEM')

yukarıdaki scriptle system tablespace’ inde nesnesi bulunan userları tespit edebilirsiniz.  Aslında system tablespace’ inde sys ve system dışında hiçbir userın nesnesinin olmaması gerekiyor. Örneğin, transportable tablespace yöntemi ile bir taşıma yapmadan önce taşınacak tablespace’ in database deki diğer tablespace lerle olan ilişkilerini çıkartıyoruz. Burdaki iş kurallarından biri hiçbir tablespace’ in system tablespace’ i ile ilişkisinin olmaması gerekiyor. Eğer bu tarz bir durumla karşılaşırsanız öncelikle bu objeleri taşımanız gerekecektir.

Peki bunları nasıl taşıyacağız. Aslında bunun birkaç yolu var, ben en kolayı olanından bahsetmek istiyorum. Aşağıdaki ilk komut ile istediğiniz tabloların tablespace’ lerini değiştirebilirsiniz. Ancak bu işlemi yaptıkdan sonra tabloların üzerlerindeki indexler bozulacağından onlarında rebulid edilmesi gerekecektir. Onun içinde ikinci scripti kullanabilirsiniz.

-- tabloları taşımak için ;

SELECT 'ALTER TABLE ' || OBJECT_NAME ||' MOVE TABLESPACE '||' tasinacak_tablespace ;'
FROM ALL_OBJECTS
WHERE OWNER = 'tasinacak_user'
AND OBJECT_TYPE = 'TABLE' ;

-- indexleri rebuild etmek için

SELECT 'ALTER INDEX '||INDEX_NAME||' REBUILD TABLESPACE tasinacak_tablespace ;' FROM ALL_INDEXES
WHERE OWNER = 'tasinacak_user' ;


Bu tarz durumları düşmemek için kullandığınız systemlerde var olan userların default tablespace’ lerini kontrol etmeniz sizin yararınıza olacaktır. Çünkü default tablespace’ iniz ne ise oluşturacağınız tüm nesnelerde o tablespace üzerinde oluşacaktır.

-- Kullanıcıların default tablespace’ lerini kontrol etmek için ;

SELECT username, account_status, default_tablespace  FROM dba_users
WHERE account_status = 'OPEN'

-- Kullanıcıların default tablespace’ lerini değiştirmek için ;

ALTER USER test_user DEFAULT TABLESPACE  USERS;


Kamil TÜRKYILMAZ

Enterprise Manager Konsolu Drop – Create İşlemleri


Merhaba Arkadaşlar,

Oracle’ da 10g ile birlikte Enterprise Manager da artık web tabanlı olarak hizmet vermeye başladı. 11g ile de (grid mimariyle birlikte) bu gelenek devam ediyor. Konsol ekranında zaman zaman vermiş olduğu hatalarla start edilemediği durumlarla karşı karşıya kalabiliyoruz. Bu tarz durumlarda bazen konsolu drop – create etmek zorunda kalabiliriz. Drop – create işlemleri oracle’ ın versiyonuna göre bir  takım farklılıklar gösterebiliyor.

Şimdi bu işlemlerden kısaca bahsedelim;

Drop – create işlemine başlamadan önce linux tarafında konsolla ilgili herhangi bir processesin çalışmadığından emin olun.  * ps -ef | grep em   komutuyla buna bakabilirsiniz. Eğer çalışan bir process var ise kill ediniz.  Konsolu drop – create etmeye çalışırken (aslında oracle ile ilgili tüm işlemlerde bunu rahatlıkla söyleyebilirim) tail ile yapılan işlemin logunu izlemeniz çok faydalı olacaktır. Emd.nohup ve emoms.log dosyalatına göz atabilirsiniz.

/* Oracle 10gR1 için EM drop – create işlemi */

Sys ile systeme connect oldukdan sonra sırası ile aşağıdakileri çalıştırın;

SQL> EXEC sysman.emd_maintenance.remove_em_dbms_jobs;
SQL> EXEC sysman.setEMUserContext('',5);
SQL> REVOKE dba FROM sysman;
SQL> DECLARE
    CURSOR c1 IS
      SELECT owner, synonym_name name
      FROM dba_synonyms
      WHERE table_owner = 'SYSMAN';

BEGIN
    FOR r1 IN c1
    LOOP
        IF r1.owner = 'PUBLIC' THEN
            EXECUTE IMMEDIATE 'DROP PUBLIC SYNONYM '||r1.name;
        ELSE
            EXECUTE IMMEDIATE 'DROP SYNONYM '||r1.owner||'.'||r1.name;
        END IF;
    END LOOP;
END;
/

SQL> DROP USER mgmt_view CASCADE;
SQL> DROP ROLE mgmt_user;
SQL> DROP USER sysman CASCADE;


#./emca

İle create edin.


/* 10gR2 ve 11gR2 için EM drop – create işlemi */

-- önce drop ;

emca -deconfig dbcontrol db -repos drop

Database SID: CSG
Listener port number: 1521
Password for SYS user: oracle
Password for SYSMAN user: oracle

Do you wish to continue? [yes(Y)/no(N)]: Y


-- sonra create ;

emca -config dbcontrol db -repos create


Database SID: CSG
Listener port number: 1521
Password for SYS user: oracle
Password for DBSNMP user: oracle
Password for SYSMAN user: oracle
Email address for notifications (optional):
Outgoing Mail (SMTP) server for notifications (optional):

You have specified the following settings

Database ORACLE_HOME ................ /home/oracle/102
Database hostname ................ prod
Listener port number ................ 1521
Database SID ................ CSG
Email address for notifications ...............
Outgoing Mail (SMTP) server for notifications ...............

Do you wish to continue? [yes(Y)/no(N)]: Y


Kamil TÜRKYILMAZ 

23 Ekim 2010 Cumartesi

UNDO Tablespace’ ini Drop Etmek


Zaman içerisinde undo tablespace’ i çok büyüdüğünde ve resize edilemediği durumlarda drop-create etmek en kolay çözüm olmakta, aşağıda bu işlemin nasıl yapılabileceğini özetlemeye çalıştım. 
var olan undotbs tablespace’ ini ilk olarak drop etmeye çalışırsan; 

DROP TABLESPACE UNDOTBS1 INCLUDING CONTENTS AND datafiles 
-- bu hatayi verdi ./* ORA-30013: undo tablespace 'UNDOTBS1' is currently in use */ 

Çünkü her database mutlaka bir tane undo tbs’ ine sahip olmalı, şu anda bizde var olan o bir tane undo tbs’ ini drop etmeye çalıştığımızdan hata alıyoruz. 

-- önce başka bir undo tablespace yaratmamız lazım; 

CREATE UNDO TABLESPACE "UNDOTBS2" DATAFILE'C:\ORACLE\10.2\ORADATA\PROD\UNDOTBS2_01.dbf' SIZE 100M 
AUTOEXTEND ON NEXT 256K MAXSIZE 5000M RETENTION NOGUARANTEE ; 

-- sonra tekrar drop etmeyi deneyelim; 

DROP TABLESPACE UNDOTBS1 INCLUDING CONTENTS AND datafiles; 
-- ayni hatyi tekrar aldim. /* ORA-30013: undo tablespace 'UNDOTBS1' is currently in use */ 

Çünkü henüz systeme yeni tanıttığımız undo tbs’ ini tanıtmadık, yani undo_tbs2 ile varolan undotbs’ yi switch etmedik. 

ALTER SYSTEM SET Undo_Tablespace=UNDOTBS2 scope=BOTH

-- tekrar drop etmeyi deneyelim,

DROP TABLESPACE UNDOTBS1 INCLUDING CONTENTS AND datafiles
Tablespace dropped.


Kamil TÜRKYILMAZ 

TEMP Tablespace’ ini Drop Etmek


Bir önceki yazımda undo tablespace’ ini recreate etmek den bahsetmiştim. Aslında aynı mantık Temp tablespace’ i içinde geçerli diyebiliriz. Temp tablespace’ inide zaman zaman drop-create etmemiz gerekebiliyor. Burda da benzer bir yöntem uyguluyoruz.

-- 1. önce baska bir temporary tablespace yarat
--2 Yeni oluşturduğun temp tablespace’ ini Default olarak işaretle,
--2. sonra oncekini drop et

CREATE TEMPORARY TABLESPACE TEMP2 TEMPFILE'C:\ORACLE\10.2\ORADATA\PROD\temp2_01.dbf' SIZE 100M AUTOEXTEND ON NEXT 256K
MAXSIZE UNLIMITED EXTENT MANAGEMENT LOCAL UNIFORM SIZE 1M;

ALTER DATABASE DEFAULT TEMPORARY TABLESPACE TEMP2;

DROP TABLESPACE temp INCLUDING CONTENTS AND datafiles    


Kamil TÜRKYILMAZ

Oracle Upgrade from 10.1.0.1 to 10.1.0.5 on IBM AIX 5.3


Merhaba,

IBM AIX 5.3 üzerine 10gR1 kurdukdan sonra 10.1.0.5’ upgrade etmeye çalışırken karşılaştığım bir hatadan ve çözüm yolundan bassedeceğim. Software ve database kurulumunu sorunsuz bir şekilde yaptıkdan sonra tüm oracle servislerini down edip (ps –ef | grep ora ilede kontrol edebilirsiniz) upgrade işlemine başladık sonrada installion’ ın bir noktasında libttsh10.a adında bir dosyaya hata verdi. Konuyu biraz araştırdıkdan sonra metalinkde sorunun çözümünü buldum.

Adı geçen dosya kurulum esnasında sürekli olarak up oluyor (upgrade işlemi boyunca 4 defa kill etmek zotrunda kaldım), devam edebilmeniz için ilgili processi kill edip root ile  “/usr/sbin/slibclean”  komutunu çalıştırmanız gerekiyor.

Konuyla ilgili detaylı bilgiye metalink üzerinden  ulaşabilirsiniz.

Document_ID 337548.1  
(libttsh10.a: Text File Busy Installing 10.1.0.x on AIX 5L)


Kamil TÜRKYILMAZ 

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.