DBMS_REDEFINITION Table Partitition

DBMS_REDEFINITION, Oracle veritabanı yönetim sistemi (DBMS) tarafından sağlanan bir özelliktir ve mevcut bir tabloyu veya nesneyi yeniden tanımlamak için kullanılır. Bu özellik, tabloların yapısını (sütunlar, veri tipleri, kısıtlamalar vb.) Değiştirmenize izin verirken, tablo üzerinde çalışan uygulamaları veya işlemleri etkilemeden güncellemeleri gerçekleştirmenizi sağlar.

Örnek bir senaryo üzerinden LOB alanları bulunan BELGE 'lerin bulunduğu tablomuzu YIL bazlı olarak Partitioning yapalım.YIL 'lara göre Tablespace ( Tablo alanlarına ) bölelim veriyi yaymış ve genişletilebilir bir hale getirelim.

-- Her yıl için ve birde fazladan tablonun diğer verileri (index vb)  bir TABLESPACE oluşturuyoruz.
CREATE BIGFILE TABLESPACE TS_DOSYA NOLOGGING;
CREATE BIGFILE TABLESPACE TS_DOSYA_2018 NOLOGGING;
CREATE BIGFILE TABLESPACE TS_DOSYA_2019 NOLOGGING;
CREATE BIGFILE TABLESPACE TS_DOSYA_2020 NOLOGGING;
CREATE BIGFILE TABLESPACE TS_DOSYA_2021 NOLOGGING;
CREATE BIGFILE TABLESPACE TS_DOSYA_2022 NOLOGGING;
CREATE BIGFILE TABLESPACE TS_DOSYA_2023 NOLOGGING;
CREATE BIGFILE TABLESPACE TS_DOSYA_2024 NOLOGGING;

-- Öncelikle ara tabloyu oluşturuyoruz
create table DOSYALAR.ARA_TABLO (
  ID            NUMBER,
  BELGE         BLOB,
  BELGE_TARIHI  DATE
)
LOB (BELGE) STORE AS SECUREFILE SEGMENT_DOSYA (
  DEDUPLICATE
  TABLESPACE  TS_DOSYALAR
  DISABLE      STORAGE IN ROW)
TABLESPACE TS_DOSYA
NOCOMPRESS 
NOCACHE
NOLOGGING   -- Archivelog üretmesini önlemek için    
PARTITION BY RANGE (BELGE_TARIHI)
INTERVAL(NUMTOYMINTERVAL(1,'YEAR'))
   (PARTITION YIL_2018 VALUES LESS THAN (TO_DATE ('01/01/2019', 'DD/MM/YYYY')) TABLESPACE TS_DOSYA_2018 NOLOGGING LOB (BELGE) STORE AS SECUREFILE SEGMENT_DOSYA_2018 (DEDUPLICATE TABLESPACE  TS_DOSYA_2018 DISABLE STORAGE IN ROW NOCACHE),
    PARTITION YIL_2019 VALUES LESS THAN (TO_DATE ('01/01/2020', 'DD/MM/YYYY')) TABLESPACE TS_DOSYA_2019 NOLOGGING LOB (BELGE) STORE AS SECUREFILE SEGMENT_DOSYA_2019 (DEDUPLICATE TABLESPACE  TS_DOSYA_2019 DISABLE STORAGE IN ROW NOCACHE),
    PARTITION YIL_2020 VALUES LESS THAN (TO_DATE ('01/01/2021', 'DD/MM/YYYY')) TABLESPACE TS_DOSYA_2020 NOLOGGING LOB (BELGE) STORE AS SECUREFILE SEGMENT_DOSYA_2020 (DEDUPLICATE TABLESPACE  TS_DOSYA_2020 DISABLE STORAGE IN ROW NOCACHE),
    PARTITION YIL_2021 VALUES LESS THAN (TO_DATE ('01/01/2022', 'DD/MM/YYYY')) TABLESPACE TS_DOSYA_2021 NOLOGGING LOB (BELGE) STORE AS SECUREFILE SEGMENT_DOSYA_2021 (DEDUPLICATE TABLESPACE  TS_DOSYA_2021 DISABLE STORAGE IN ROW NOCACHE),
    PARTITION YIL_2022 VALUES LESS THAN (TO_DATE ('01/01/2023', 'DD/MM/YYYY')) TABLESPACE TS_DOSYA_2022 NOLOGGING LOB (BELGE) STORE AS SECUREFILE SEGMENT_DOSYA_2022 (DEDUPLICATE TABLESPACE  TS_DOSYA_2022 DISABLE STORAGE IN ROW NOCACHE),
    PARTITION YIL_2023 VALUES LESS THAN (TO_DATE ('01/01/2024', 'DD/MM/YYYY')) TABLESPACE TS_DOSYA_2023 NOLOGGING LOB (BELGE) STORE AS SECUREFILE SEGMENT_DOSYA_2023 (DEDUPLICATE TABLESPACE  TS_DOSYA_2023 DISABLE STORAGE IN ROW NOCACHE),
    PARTITION YIL_2024 VALUES LESS THAN (TO_DATE ('01/01/2025', 'DD/MM/YYYY')) TABLESPACE TS_DOSYA_2024 NOLOGGING LOB (BELGE) STORE AS SECUREFILE SEGMENT_DOSYA_2024 (DEDUPLICATE TABLESPACE  TS_DOSYA_2024 DISABLE STORAGE IN ROW NOCACHE))
;    

-- Partition yapmak istediğimiz tablounun yapılıp yapılamayacağını kontrol ediyoruz
BEGIN
    SYS.DBMS_REDEFINITION.can_redef_table (
        uname          => 'DOSYALAR',
        tname          => 'BELGELER',
        options_flag   => DBMS_REDEFINITION.CONS_USE_ROWID);
END;
/

-- Büyük tablolarda bu işlem uzun süreceği için sessionun paralel seviyesini ayarlıyoruz.
ALTER SESSION FORCE PARALLEL DML PARALLEL 8;
ALTER SESSION FORCE PARALLEL QUERY PARALLEL 8;

--  Burada tablo isimlerini ters yazarsanız veri kaybı yaşayabilirsiniz!!!
--  Redefinition işlemini başlatıoyruz   SCHEMA , ORGIGINAL, TARGET
EXEC DBMS_REDEFINITION.start_redef_table('DOSYALAR', 'BELGELER', 'ARA_TABLO');

-- Tabloyla ilişkili nesneleri yetkileri kopyalıyoruz
SET SERVEROUTPUT ON
DECLARE
  l_num_errors PLS_INTEGER;
BEGIN
  DBMS_REDEFINITION.copy_table_dependents(
    uname             => 'DOSYALAR',
    orig_table        => 'BELGELER',
    int_table         => 'ARA_TABLO',
    copy_indexes      => DBMS_REDEFINITION.cons_orig_params, -- Non-Default
    copy_triggers     => TRUE,  -- Default
    copy_constraints  => TRUE,  -- Default
    copy_privileges   => TRUE,  -- Default
    ignore_errors     => FALSE, -- Default
    num_errors        => l_num_errors); 
  DBMS_OUTPUT.put_line('l_num_errors=' || l_num_errors);
END;
/

-- Index oluşturmadan önce yeni tabloyu ara tabloyla senkronize ediyor.
EXEC DBMS_REDEFINITION.sync_interim_table('DOSYALAR', 'BELGELER', 'ARA_TABLO'); 

-- Redefinition işlemini bitiriyoruz (Tablo isimlerini değiştiriyoruz):
EXEC DBMS_REDEFINITION.finish_redef_table('DOSYALAR', 'BELGELER', 'ARA_TABLO');

-- Artık ara tabloyla işimiz bittiğine göre silebiliriz
DROP TABLE DOSYALAR.ARA_TABLO;

-- Eger işlemi çalışırken iptal etmek isterseniz
EXEC DBMS_REDEFINITION.ABORT_REDEF_TABLE('DOSYALAR', 'BELGELER', 'ARA_TABLO');

Yorum Gönder

Daha yeni Daha eski