Home / MAKALELER / Veri Tabanı / dbms_redefination paketi

dbms_redefination paketi

dbms_redefinition Paketi

Dbms pakentlerinden biri olan “dbms_redefinition” paketini kullanımı hakkında biraz bilgi vereceğim.
Çalıştığım yerde hatta çoğu şirkette production veritabanlarında işlemlerin online olarak yani kesinti

olmadan yapılabilmesi çok çok önemlidir.

Bulunduğum şirkette Long olarak yaratılmış kolonlara sahip tablolar mevcuttu. Long veri yapısnın kod tarafında veya
veritabanı yönetiminde zorluklar çıkarması nedeniyle Clob ile değiştirilmesi planlandı.

Bu planlamada alter ile kolonu değiştirdiğimizde tablo kilitlenmekde ve bu süreçtede diğer işlemlerin yapılması
engellenmekteydi.

Bundan dolayı online şekilde bir tablonun taşınması için dbms_redefinition paketini kullandık.

1) İlk başta şuanki tablonun sadece bir kolon tipi (LONG –> CLOB) değişecek şekilde tablo oluşturuyoruz.

CREATE
TABLE ERDEM.ERDEMTABLE_TMP
(
OID CHAR(16 BYTE),
STATE NUMBER(32,0),
STATE_BAG CLOB

);

2) Daha sonra taşınacak oan ana tabloyu dbms_redefinition yapılacağını belirtiyoruz.

exec dbms_redefinition.can_redef_table(‘ERDEM’, ‘ERDEMTABLE’, dbms_redefinition.cons_use_pk);

3) Eski tablodan yeni tabloya veri taşıma işlemini başlatıyoruz.

BEGIN
dbms_redefinition.Start_redef_table(‘ERDEM’,’ERDEMTABLE’,’ERDEMTABLE_TMP’,
‘OID OID,
STATE STATE,
TO_LOB(STATE_BAG) STATE_BAG’);
END;

4) Taşıma işimiz bittikden sonra. Tablo üzerinde bulunan index, constraint,triggers ve privilege leri yeni tabloya göre
oluşturulmasını sağlıyoruz. Yani tablo bağımlılıklarını kopyalıyoruz.

DECLARE
num_errors PLS_INTEGER;
BEGIN
dbms_redefinition.Copy_table_dependents(‘ERDEM’, ‘ERDEMTABLE’, ‘ERDEMTABLE_TMP’,
copy_indexes => dbms_redefinition.cons_orig_params,
copy_triggers => TRUE,
copy_constraints => TRUE,
copy_privileges => TRUE,
ignore_errors => TRUE,
num_errors => num_errors,
copy_statistics => FALSE);
dbms_output.put_line(num_errors||’ errors’);
END;

5)Bağımlılıklar kopyalandıkdan sonra bir hata varmı diye aşağıdaki sorudan kontrol yapmanız mümkündür.
Eğer SYS_ ile başlayan index, constraint hatalarına sahip isek bunları es geçebiliriz. Bular otomatikman oluşturulduğundan ana tablodaki isimlerle farklı
isimlendirilmiştir.

SELECT object_name,base_table_name,DDL_TXT FROM dba_redefinition_errors;

6) Sondan bir önceki adımımızda eğer yeni tabloya bir dml işlemi geldiyse senkronizasyon oluştuğundan bunun giderilmesi gereklidir.
Bu senkronizasyonu aşağıdaki gibi yaparız.Bu işlemi yapmamız zorunluluk değildir.

exec dbms_redefinition.sync_interim_table(‘ERDEM’, ‘ERDEMTABLE’, ‘ERDEMTABLE_TMP’);

7) Bir önceki işlemi eğer yapmadığınız veya bu paketi çalıştırdığınız süre zarfında bir değişiklik söz konusu ise
burada ilk başta senkronizasyon tabablanır ve tablolar yer değiştirir.

exec dbms_redefinition.finish_redef_table(‘ERDEM’, ‘ERDEMTABLE’, ‘ERDEMTABLE_TMP’);

ERDEMTABLE(LONG) —> ERDEMTABLE_TMP(LONG)

ERDEMTABLE_TMP(CLOB) —> ERDEMTABLE(CLOB)

NOT: Eğer bu işlemler sırasında hata aldınız ve bu işlemi sonlandırmak istiyorsanız aşağıdaki
komutu çalıştırabilirsiniz.

exec DBMS_REDEFINITION.ABORT_REDEF_TABLE(‘ERDEM’, ‘ERDEMTABLE’, ‘ERDEMTABLE_TMP’);

About Erdem Dayioglu

1985 Yılında İstanbulda doğdum. Lise öğrenimimi Kartal Anadolu Lisesinde yaptım.(1999-2003) Lisans öğrenimimi Uluslararası Kıbrıs Üniversitesi Bilgisayar Mühendisliği bölümünde yaptım(2004-2009).Şuanda İstanbul Ticaret Üniversitesinde İşletme yüksek Lisansıma devam etmekteyim.(2011- ) Oracle la üniversitemde veritanaı dersiyle tanıştım. Mezun oldukdan sonrada 2010 yılında Oracle DBA eğitimi aldım. Oracle DBA lik eğitimimden sonra hayalimdeki meslek oldu. Şuan da bir bankada Oracle DBA olarak görev almaktayım. Bu işimden önce bazı iş deneyimlerim olsada, şuan ki işimle hayallerime başlangıç yapmış bulunmaktayım

İlginizi Çekebilir

SQL Server ile Veri Şifreleme

Bilgi teknolojilerinde verinin güvenliği çok kritik bir öneme sahiptir. Önemli verileri korumak için ekstra bir …

Bir Cevap Yazın