2010 Oracle Day Üzerine ….

Merhaba, 

Bugün 2010 Oracle Day etkinliğine katıldım. Çok başarılı bir etkinlik olduğunu söyleyebilirim.  Özellikle TROUG’ un tanıtımı başta Tonguç ve Zekeriya Hoca olmak üzere diğer tüm arkadaşlar tarafından  başarıyla yapıldığını söyleyebilirim. İnsanların tanışmaları ve tecrübelerin paylaşılması adına bu grubu çok önemsiyorum.   

Oracle Day’ da emeği geçen tüm arkadaşları şahsım adına canı gönülden tebrik ederim. 

Bikaç cümlede oluşturmaya çalıştığım blog hakkında bişeyler söylemek istiyorum. 

Blog oluşturmayı aslında uzun zamandır düşünüyordum ama bir türlü bunun için fırsat bulamamıştım. Blog’ u  oluşturmaya başlamadan önce bu işin bu kadar zevkli olabileceğini tahmin etmezdim. Henüz çok yeni aslında daha bikaç aylık ama zaman içerisinde sanırım ortaya güzel bişeyler çıkacak. (yani umarım çıkar :))    

Arkadaşlar, eklediğim notlar ile ilgili olarak,  eleştirilerinizi, sorularınızı benimle paylaşırlasınız inanın çok mutlu olurum. Bunlarıda burada paylaşmakdan zevk duyarım. Bana kamil.turkyilmaz@gmail.com adresinden ulaşabilirsiniz. 

Başka bir yazıda görüşmek üzere ….

Oracle upgrade (from 10gR1 – 10gR2 to 11gR2) – 2

Upgrade operayonuna devam 🙂 

Yeni ORACLE_HOME/bin adresinden DBUA çalıştırılır.

Listede upgrade etmek istediğimiz database yoksa etc/oratab (/var/opt/oracle altında da olabilir)dosyasında adı geçip geçmediği kontrol edilir.

Daha önceden almadıysak eğer eski database’in yedeğini al seçeneği işaretlenir. DBUA upgrade öncesi database’i kapatarak cold backupını alır. Dbf’lerin yanısıra bunları geri dönmek için gerekli  db_name_restore.sh scriptini de oluşturur. (Bu işlemi biz yapmış olduğumuzu varsayarak devam ediyoruz)  
Continue reading

Oracle upgrade (from 10gR1 – 10gR2 to 11gR2) – 1

Oracle zaman içerisinde yeni sürümlerini piyasaya sürdükçe bizlerde zamanı geldikçe kullandığımız oracle versiyonlarımızı bir üst sürüme upgrade etmek durumunda kalıyoruz. Oracle son 3 versiyonuna destek verdiğinden dolayı metalink üzerinden destek alıyorsanız kullandığınız versiyonunuz mutlaka 9i veya sonrası olmak zorunda, ki çok yakın bir tarihde 9i’ ninde desupported olacağını tahmin etmek zor olmasa gerek.

Bugün bu upgrade işlemi ile ilgili olarak öncesinde ve sonrasında yapılması gerekenleri anlatmaya çalışacağım.

Aşağıdaki örnekde 10gR1 – 10gR2 den 11gR2 ye upgrade işlemini kapsamaktadır.
Continue reading

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

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.

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;