ORA-39183: internal error -19 ocurred during decompression phase 2

11gR2’ de olan bir oracle database’ inden 32 parallellik verilerek NFS olarak share edilmiş olan bir diske alınmış olan bir export backup’ı başka bir sistem üzerine import etmeye çalıştığımız da aşağıdaki gibi bir hata almıştık. Araştırdığımız da sorunun dmp file ‘ lerden birinde oluşan bir corruptiondan dolayı olduğunu gördük.

Çalışmaya ait logları ve ilgili hataya ait metalink notunu da aşağıda bulabilirsiniz.

Çözüm olarak import edilmeye çalışılan dmp file’ lerin ftp ile binary mode’ da import edilecek olan sunucuya tekrar taşınması ve import işleminin tekrar denenmesi gerekmektedir.

Reference;
DataPump Import Errors ORA-39183 Internal Error -19 Ocurred During Decompression Phase 2 ORA-6512 (Doc ID 1524577.1)

Export File’ in Header Satırlarını Nasıl Okuyabiliriz

Bu örnekde oracle 11gR2 olan bir database’ imizden alınmış olan bir export file’ in (parallel olarak almıştım o yüzden sadece bir parçasına bakıyor olacağız) header’ ında hangi bilgilerin olduğunu nasıl görebilirize bakıyor olacağız.

Öncesinde yine dmp içerisinde yer alan DDL komutlarını görmek isterseniz exp ile alınmış bir backup için import komutunun içerisine “show=y” parametresini expdp ile alınmış bir backup içinde yine import komutu içerisine “SQLFILE=file_name.sql” parametresini ekleyebilirsiniz. Böylelikle dmp file içerisinden çalışacak olan DDL komutlarını görme şansını yakalamış olursunuz.

Gelelim bizim örneğimize;

Aşağıdaki gibi bir procedurumuz var. Kaynak kısmında belirtmiş olduğum linkden de indirebileceğiniz bu proceduru database’ imize create ediyoruz;

Continue reading

Expdp – Impdp (Datapump) Komutları ve Kullanımı Üzerine …

Öncelikle expdp – impdp’ yi nerde ve ne zaman kullanabileceğimizden biraz bahsedelim, çok farklı nedenlerle kullanılabilmekle beraber en çok karşılaştığımız durumlar;

• Bir schema’ nın altındaki bir kısım veya tüm dataları farklı bir schema altına taşımak
istediğimizde,
• Oracle versiyonu değiştiğinde dataları taşımak için,
• Operating system değiştiğinde datayı taşımak için,
• Logical Backup almak istediğimizde

Bu yönteme sıklıkla başvururuz.

Export ve import işlemlerini nasıl yapılacağından, yapılan bu aktarım sonrasında işlemin hatasız gerçekleşip gerçekleşmediğinden ve bu işlemleri nasıl biraz daha performanslı yapabilirizden biraz bahsetmek istiyorum. Öncelikle expdp ve impdp’ da çok sık olarak kullanılan komutlara birer örnekle açıklamaya çalışalım sonrasında performansı artırmak için neler yapabiliriz ona bakalım.
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.

Transportable Tablespace Yöntemi İle Database Taşımak

Bu yöntem taşınacak database ile hedef database’ in işletim sistemleri farklı olduğunda, 32 bitden 64 bite geçilmesi gerektiğinde veya aynı ortamın birebir aynısından bir tane daha oluşturulması gerektiğinde (exp-imp göre oldukça hızlıbir yöntem olduğundan) kullanılabilir. 

Database’ in taşınması ile ilgili olarak yapılacak işlemler ; 

1. Hedef database üzerinde instance create edilir. İnstance create edilme işlemi sonrasında USERS tablespace’ ide otomatik olarak oluştuğundan dolayı (kaynak database den de USERS tablespace’ i alınacağından dolayı burada bu isimde tablespace olmaması gerekmektedir) bu tablespace drop edilir. 
Continue reading