DBMS_REDEFINITION kullanılarak bir tablonun online olarak partitioned yapılması

26 Tem by Ahmet Duruöz

DBMS_REDEFINITION kullanılarak bir tablonun online olarak partitioned yapılması

Oracle veritabanında DBMS_REDEFINITION paketi ile online olarak tabloların yapılarında değişiklik yapmak mümkündür. Partitioned olmayan bir tabloyu online olarak DBMS_REDEFINITION ile partitioned yapıya dönüştürebiliriz. İşlem adımları aşağıdaki gibi olacaktır.

Aşağıdaki örnekte partitioned olmayan DEMO1 tablosunu , partitioned olan  DEMO tablosuna dönüştürülmesi için gerekli adımlar belirtilmiştir.

DBMS_REDEFINITION ile işlem yapılacak kaynak tabloda mutlaka primary key bulunması gerekmektedir.

Partitioned olmayan ama olmasını istediğimiz tabloyu primary key içerecek şekilde oluşturalım.

CREATE TABLE demo1
(
   id           NUMBER (8),
   t_gorev      DATE,
   gorev	VARCHAR(255),
   CONSTRAINT redef_tab_pk PRIMARY KEY (id)
)

Hedeflenen yapıdaki tabloyu oluşturalım.

CREATE TABLE demo
(
   id                 NUMBER (8),
   t_gorev      DATE,
   gorev		VARCHAR(255),
   partition_year     AS (EXTRACT (YEAR FROM t_gorev)),
   partititon_month   AS (EXTRACT (MONTH FROM t_gorev))
)
PARTITION BY RANGE (partition_year)
   SUBPARTITION BY RANGE (partititon_month)
   (PARTITION year_2011 VALUES LESS THAN (2011),
    PARTITION year_2012
       VALUES LESS THAN (2012)
       (
          SUBPARTITION p1 VALUES LESS THAN (2),
          SUBPARTITION P2 VALUES LESS THAN (3),
          SUBPARTITION P3 VALUES LESS THAN (4),
          SUBPARTITION P4 VALUES LESS THAN (5),
          SUBPARTITION P5 VALUES LESS THAN (6),
          SUBPARTITION P6 VALUES LESS THAN (7),
          SUBPARTITION P7 VALUES LESS THAN (8),
          SUBPARTITION P8 VALUES LESS THAN (9),
          SUBPARTITION P9 VALUES LESS THAN (10),
          SUBPARTITION P10 VALUES LESS THAN (11),
          SUBPARTITION P11 VALUES LESS THAN (12),
          SUBPARTITION P12 VALUES LESS THAN (13)),
    PARTITION year_2013
       VALUES LESS THAN (2013)
       (
          SUBPARTITION p2013_1 VALUES LESS THAN (2),
          SUBPARTITION P2013_2 VALUES LESS THAN (3),
          SUBPARTITION P2013_3 VALUES LESS THAN (4),
          SUBPARTITION P2013_4 VALUES LESS THAN (5),
          SUBPARTITION P2013_5 VALUES LESS THAN (6),
          SUBPARTITION P2013_6 VALUES LESS THAN (7),
          SUBPARTITION P2013_7 VALUES LESS THAN (8),
          SUBPARTITION P2013_8 VALUES LESS THAN (9),
          SUBPARTITION P2013_9 VALUES LESS THAN (10),
          SUBPARTITION P2013_10 VALUES LESS THAN (11),
          SUBPARTITION P2013_11 VALUES LESS THAN (12),
          SUBPARTITION P2013_12 VALUES LESS THAN (13)));

Online redefinition işlemininin ilgili tablo için uygunluğunu kontrol edelim.

BEGIN
   SYS.DBMS_REDEFINITION.can_redef_table (
      uname          => 'ADURUOZ',
      tname          => 'DEMO1',
      options_flag   => DBMS_REDEFINITION.CONS_USE_ROWID);
END;
/

Gerekli işlemin başlamasını sağlayalım.

BEGIN
   SYS.DBMS_REDEFINITION.start_redef_table (uname        => 'ADURUOZ',
                                            orig_table   => 'DEMO1',
                                            int_table    => 'DEMO');
END;
/

Tablolardaki verilerin sekron olmasını sağlayalım.

BEGIN
   DBMS_REDEFINITION.sync_interim_table (uname        => 'ADURUOZ',
                                         orig_table   => 'DEMO1',
                                         int_table    => 'DEMO');
END;
/

Online redefinition işlemininin tamamlanmasını sağlayalım.

BEGIN
   DBMS_REDEFINITION.finish_redef_table (uname        => 'ADURUOZ',
                                         orig_table   => 'DEMO1',
                                         int_table    => 'DEMO');
END;
/

Bu adımlardan sonra partition olmayan DEMO1 tablomuz , partitioned olarak oluşturduğumuz DEMO tablosunun yapısına dönüşmüştür. Olmayan kolonlar eklenmiş ve partition ve subpartition şeklinde verileri düzenlenmiştir. DEMO tablomuz ise DEMO1 tablomuzun eski haline dönüştüğünü görebiliriz.

SQL> desc ADURUOZ.DEMO;
 Name					   Null?    Type
 ----------------------------------------- -------- ----------------------------
 ID					   NOT NULL NUMBER(8)
 T_GOREV					    DATE
 GOREV						    VARCHAR2(255)

SQL> desc ADURUOZ.DEMO1;
 Name					   Null?    Type
 ----------------------------------------- -------- ----------------------------
 ID						    NUMBER(8)
 T_GOREV					    DATE
 GOREV						    VARCHAR2(255)
 PARTITION_YEAR 				    NUMBER
 PARTITITON_MONTH				    NUMBER

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Lütfen captcha kodunu giriniz *

Lütfen Resimdeki Kodu Boşluğa Giriniz.