DBMS_REDEFINITION ile tabloyu online yeniden tanımla (tam akış)
OracleOnline İşlemlerKomut
-- 1) Uygun mu? (PK yoksa CONS_USE_ROWID kullan)
EXEC DBMS_REDEFINITION.CAN_REDEF_TABLE('MUSTERI_APP', 'MUSTERI', DBMS_REDEFINITION.CONS_USE_PK);
-- 2) Hedef yapida ara (interim) tablo: ornekte hash partition'li
CREATE TABLE musteri_app.musteri_int (
id NUMBER, ad VARCHAR2(100), il VARCHAR2(30))
PARTITION BY HASH (id) PARTITIONS 8;
-- 3) Baslat: ilk kopya + MV log ile degisiklik takibi
BEGIN
DBMS_REDEFINITION.START_REDEF_TABLE(
uname => 'MUSTERI_APP',
orig_table => 'MUSTERI',
int_table => 'MUSTERI_INT',
col_mapping => NULL,
options_flag => DBMS_REDEFINITION.CONS_USE_PK);
END;
/
-- 4) Index, constraint, trigger, grant ve istatistikleri kopyala:
SET SERVEROUTPUT ON
DECLARE
l_errors PLS_INTEGER;
BEGIN
DBMS_REDEFINITION.COPY_TABLE_DEPENDENTS(
uname => 'MUSTERI_APP',
orig_table => 'MUSTERI',
int_table => 'MUSTERI_INT',
copy_indexes => DBMS_REDEFINITION.CONS_ORIG_PARAMS,
copy_triggers => TRUE,
copy_constraints => TRUE,
copy_privileges => TRUE,
ignore_errors => FALSE,
num_errors => l_errors,
copy_statistics => TRUE);
DBMS_OUTPUT.PUT_LINE('Hata sayisi: ' || l_errors);
END;
/
SELECT object_name, base_table_name, ddl_txt FROM dba_redefinition_errors;
-- 5) Bitis oncesi farki kapat (finish suresini kisaltir; birkac kez calistirilabilir):
EXEC DBMS_REDEFINITION.SYNC_INTERIM_TABLE('MUSTERI_APP', 'MUSTERI', 'MUSTERI_INT');
-- 6) Kisa kilitle yer degistir:
EXEC DBMS_REDEFINITION.FINISH_REDEF_TABLE('MUSTERI_APP', 'MUSTERI', 'MUSTERI_INT', dml_lock_timeout => 60);
-- 7) Artik eski yapiyi tasiyan ara tabloyu kaldir:
DROP TABLE musteri_app.musteri_int PURGE;
-- Sorun olursa: EXEC DBMS_REDEFINITION.ABORT_REDEF_TABLE('MUSTERI_APP', 'MUSTERI', 'MUSTERI_INT');
-- Durum: SELECT * FROM dba_redefinition_status WHERE base_table_owner = 'MUSTERI_APP';Ne yapar?
Tablonun yapısını (partitioning, kolon tipi/sırası, tablespace, sıkıştırma, LOB ayarları) uygulama çalışırken değiştirir: veri ara tabloya kopyalanır, değişiklikler MV log ile senkronlanır, sonunda çok kısa bir lock ile isimler yer değiştirir.
Ne zaman kullanılır?
Partition'sız büyük bir tabloyu kesintisiz partition'lı hale getirmek, kolon tipini değiştirmek, BasicFile LOB'u SecureFile'a çevirmek gibi ALTER TABLE ile online yapılamayan değişikliklerde.
Dikkat
Enterprise Edition gerekir (hedef partition'lı ise Partitioning opsiyonu da). İşlem boyunca tablonun iki katı alan, ek redo ve MV log yükü oluşur. FINISH aşaması kısa bir exclusive lock alır; uzun süren transaction'lar bekletir (dml_lock_timeout). COPY_TABLE_DEPENDENTS hatalarını DBA_REDEFINITION_ERRORS'tan mutlaka kontrol et; FK'ler NOVALIDATE kopyalanabilir. Önce test ortamında prova et.