1.AMAÇ VE KAPSAM
Redefinition production ortamlarda veritabaninda kesinti yaratmadan tablo’nun storage parametrelerini degiştirmek,farkli bir tablespace taşimak veya yeni kolonlar eklemek,silmek ve degiştirmek için kullanilabilir.
Aşağıdaki çalışmamda bir tabloyu partition’li hale getirip 2009,2010,2011 yıllarına ayit partition’larını exadatanin özelliği olan “archive high” compress’liyecem,2012 yılının aylarınıda OLTP compress yapicam.Bu esnada veritabanı operasyonel olarak çalişmaya devam edicek.
Kisaca redefinition nasil çalıştığını anlatayım: yeni tablonuzu redefinitiona tanımladığınızda redef. bu tablonuzu materialized view çeviriyor ve datayı bu mv’un içine aktarıyor bu esnada orjinal tablonuzda da materialized view log olusturup tablonuza gelen insert,delete ve update işlemlerini kayit altina aliyor.
2.UYGULAMA
2.1. Tablonuz redefinition yapıp yapmamaya uygun olup olmadığımızı aşağıdaki sorgularla görebiliriz.
PK üstünden redefinition yapmak için.
SQL> EXEC DBMS_REDEFINITION.CAN_REDEF_TABLE('MVS', 'ISLEM_LOG',1);
ROWNUM üstünden redefinition yapmak için.
SQL> EXEC DBMS_REDEFINITION.CAN_REDEF_TABLE('MVS', 'ISLEM_LOG',2);
2.2. Tablonuz büyükse parallelliği açmanızı öneririm.
SQL> alter session force parallel dml parallel 32; SQL> alter session force parallel query parallel 32;
2.3. Yeni tablomuzu orjinal tablodan farklı olarak partition ve compress özelliği ekleyerek oluşturuyoruz.
SQL> CREATE TABLE MVS.ISLEM_LOG_OLD ( LOG_ID VARCHAR2(40 BYTE) NOT NULL, LOG_YAPAN VARCHAR2(40 BYTE), LOG_YAPILAN VARCHAR2(40 BYTE), LOG_ISLEM_KATEGORI VARCHAR2(25 BYTE), LOG_ISLEM VARCHAR2(255 BYTE), LOG_ISLEM_SONUC CHAR(1 BYTE), LOG_ACIKLAMA VARCHAR2(1000 BYTE), LOG_SON_ISLEM_DAMGA VARCHAR2(20 BYTE), LOG_IP VARCHAR2(15 BYTE) ) TABLESPACE AHBS_DATA_TS PCTUSED 0 PCTFREE 10 INITRANS 1 MAXTRANS 255 STORAGE ( INITIAL 64K NEXT 1M MINEXTENTS 1 MAXEXTENTS UNLIMITED PCTINCREASE 0 BUFFER_POOL DEFAULT ) NOLOGGING PARTITION BY RANGE (LOG_SON_ISLEM_DAMGA) ( PARTITION ISLEMLOG_2009 VALUES LESS THAN ('20100101000000000') LOGGING COMPRESS FOR ARCHIVE HIGH TABLESPACE LOG_TS PCTFREE 10 INITRANS 1 MAXTRANS 255 STORAGE ( INITIAL 64K NEXT 1M MINEXTENTS 1 MAXEXTENTS UNLIMITED BUFFER_POOL DEFAULT ), PARTITION ISLEMLOG_2010 VALUES LESS THAN ('20110101000000000') LOGGING COMPRESS FOR ARCHIVE HIGH TABLESPACE LOG_TS PCTFREE 10 INITRANS 1 MAXTRANS 255 STORAGE ( INITIAL 64K NEXT 1M MINEXTENTS 1 MAXEXTENTS UNLIMITED BUFFER_POOL DEFAULT ), PARTITION ISLEMLOG_2011 VALUES LESS THAN ('20120101000000000') LOGGING COMPRESS FOR ARCHIVE HIGH TABLESPACE LOG_TS PCTFREE 10 INITRANS 1 MAXTRANS 255 STORAGE ( INITIAL 64K NEXT 1M MINEXTENTS 1 MAXEXTENTS UNLIMITED BUFFER_POOL DEFAULT ), PARTITION ISLEMLOG_201201 VALUES LESS THAN ('20120201000000000') LOGGING COMPRESS FOR OLTP TABLESPACE LOG_TS PCTFREE 10 INITRANS 1 MAXTRANS 255 STORAGE ( INITIAL 64K NEXT 1M MINEXTENTS 1 MAXEXTENTS UNLIMITED BUFFER_POOL DEFAULT ), PARTITION ISLEMLOG_201202 VALUES LESS THAN ('20120301000000000') LOGGING COMPRESS FOR OLTP TABLESPACE LOG_TS PCTFREE 10 INITRANS 1 MAXTRANS 255 STORAGE ( INITIAL 64K NEXT 1M MINEXTENTS 1 MAXEXTENTS UNLIMITED BUFFER_POOL DEFAULT ), PARTITION ISLEMLOG_201203 VALUES LESS THAN ('20120401000000000') LOGGING COMPRESS FOR OLTP TABLESPACE LOG_TS PCTFREE 10 INITRANS 1 MAXTRANS 255 STORAGE ( INITIAL 64K NEXT 1M MINEXTENTS 1 MAXEXTENTS UNLIMITED BUFFER_POOL DEFAULT ), PARTITION ISLEMLOG_201204 VALUES LESS THAN ('20120501000000000') LOGGING COMPRESS FOR OLTP TABLESPACE LOG_TS PCTFREE 10 INITRANS 1 MAXTRANS 255 STORAGE ( INITIAL 64K NEXT 1M MINEXTENTS 1 MAXEXTENTS UNLIMITED BUFFER_POOL DEFAULT ), PARTITION ISLEMLOG_201205 VALUES LESS THAN ('20120601000000000') LOGGING COMPRESS FOR OLTP TABLESPACE LOG_TS PCTFREE 10 INITRANS 1 MAXTRANS 255 STORAGE ( INITIAL 64K NEXT 1M MINEXTENTS 1 MAXEXTENTS UNLIMITED BUFFER_POOL DEFAULT ), PARTITION ISLEMLOG_201206 VALUES LESS THAN ('20120701000000000') LOGGING COMPRESS FOR OLTP TABLESPACE LOG_TS PCTFREE 10 INITRANS 1 MAXTRANS 255 STORAGE ( INITIAL 64K NEXT 1M MINEXTENTS 1 MAXEXTENTS UNLIMITED BUFFER_POOL DEFAULT ), PARTITION ISLEMLOG_201207 VALUES LESS THAN ('20120801000000000') LOGGING COMPRESS FOR OLTP TABLESPACE LOG_TS PCTFREE 10 INITRANS 1 MAXTRANS 255 STORAGE ( INITIAL 64K NEXT 1M MINEXTENTS 1 MAXEXTENTS UNLIMITED BUFFER_POOL DEFAULT ), ) COMPRESS FOR OLTP NOCACHE NOPARALLEL MONITORING;
2.4. Artık redefinition işlemine başlayabiliriz.Start_redef_table tanımları sırasıyla şu şekilde (‘schema_ismi’,’orjinal_tablo’,’yeni_tablo’,’orjinal_tablo_kolon1 yeni_tablo_kolon1,orjinal_tablo_kolon2 yeni_tablo_kolon2, …..) diye gitmekte.Bu işlem bittiğinde var olan datalar yeni tablonuza aktarılmış olacak,aktarılmamış olanlarda materilized view log da saklanıcaklar.Eğer tablonuzda Pk bulunmuyorsa ROWNUM üstünden redef işinizi tamamlamanız gerekir.
PK üstünden redefinition başlatmak için.
SQL> exec dbms_redefinition.start_redef_table('MVS','ISLEM_LOG','ISLEM_LOG_OLD','LOG_ID LOG_ID, LOG_YAPAN LOG_YAPAN, LOG_YAPILAN LOG_YAPILAN,LOG_ISLEM_KATEGORI LOG_ISLEM_KATEGORI,LOG_ISLEM LOG_ISLEM,LOG_ISLEM_SONUC LOG_ISLEM_SONUC,LOG_ACIKLAMA LOG_ACIKLAMA,LOG_SON_ISLEM_DAMGA LOG_SON_ISLEM_DAMGA,LOG_IP LOG_IP');
ROWNUM üstünden redefinition başlatmak için.
SQL> exec dbms_redefinition.start_redef_table('MVS','ISLEM_LOG','ISLEM_LOG_OLD','LOG_ID LOG_ID, LOG_YAPAN LOG_YAPAN, LOG_YAPILAN LOG_YAPILAN,LOG_ISLEM_KATEGORI LOG_ISLEM_KATEGORI,LOG_ISLEM LOG_ISLEM,LOG_ISLEM_SONUC LOG_ISLEM_SONUC,LOG_ACIKLAMA LOG_ACIKLAMA,LOG_SON_ISLEM_DAMGA LOG_SON_ISLEM_DAMGA,LOG_IP LOG_IP',2);
2.5. Data taşıma işlemini bitirdiğimize göre orjinal tablodaki index,trigger,cons. ve grant gibi özellikleride yeni tablomuza taşıyabiliriz.Bu işlemi aşağıdaki gibi yada manuel olarak yapabilirsiniz.
SQL> DECLARE num_errors PLS_INTEGER; BEGIN DBMS_REDEFINITION.COPY_TABLE_DEPENDENTS('MVS','ISLEM_LOG','ISLEM_LOG_OLD',DBMS_REDEFINITION.CONS_ORIG_PARAMS,TRUE, TRUE, TRUE, FALSE, num_errors, TRUE); END; /
2.6. Redefinition işlemini uzun tutup bitirmemeniz gereken durumlar oluşabiliyor eğer aradaki süre çok açılırsa son adım olan finish_redef_table uzun sürebiliyor bu tarz durumlarda sync işlemini yapmanızda yarar var.
SQL> BEGIN DBMS_REDEFINITION.SYNC_INTERIM_TABLE('MVS','ISLEM_LOG','ISLEM_LOG_OLD'); END; /
2.7. Redef. işlemini artık bitirebiliriz. Bu komuttan sonra orjinal tablonuzla yeni tablonuz rename yapıp birbirlerinin yerine geçiceklerdir.
SQL> BEGIN DBMS_REDEFINITION.FINISH_REDEF_TABLE('MVS','ISLEM_LOG','ISLEM_LOG_OLD'); END; /
2.8. Redefinition işlemini iptal etmek için aşağıdaki komutu kullanabilirsiniz.
SQL> exec DBMS_REDEFINITION.ABORT_REDEF_TABLE('MVS', 'ISLEM_LOG', 'ISLEM_LOG_OLD')
Leave a Reply