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');
Etiketler :
Oracle