Redéfinir une table en ligne avec DBMS_REDEFINITION (flux complet)
OracleOpérations en ligneCommande
-- 1) Is it eligible? (use CONS_USE_ROWID if there is no PK)
EXEC DBMS_REDEFINITION.CAN_REDEF_TABLE('CUSTOMER_APP', 'CUSTOMER', DBMS_REDEFINITION.CONS_USE_PK);
-- 2) Interim table with the target structure: hash partitioned in this example
CREATE TABLE customer_app.customer_int (
id NUMBER, name VARCHAR2(100), city VARCHAR2(30))
PARTITION BY HASH (id) PARTITIONS 8;
-- 3) Start: initial copy + change tracking through an MV log
BEGIN
DBMS_REDEFINITION.START_REDEF_TABLE(
uname => 'CUSTOMER_APP',
orig_table => 'CUSTOMER',
int_table => 'CUSTOMER_INT',
col_mapping => NULL,
options_flag => DBMS_REDEFINITION.CONS_USE_PK);
END;
/
-- 4) Copy indexes, constraints, triggers, grants and statistics:
SET SERVEROUTPUT ON
DECLARE
l_errors PLS_INTEGER;
BEGIN
DBMS_REDEFINITION.COPY_TABLE_DEPENDENTS(
uname => 'CUSTOMER_APP',
orig_table => 'CUSTOMER',
int_table => 'CUSTOMER_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('Error count: ' || l_errors);
END;
/
SELECT object_name, base_table_name, ddl_txt FROM dba_redefinition_errors;
-- 5) Close the gap before finishing (shortens finish; can be run several times):
EXEC DBMS_REDEFINITION.SYNC_INTERIM_TABLE('CUSTOMER_APP', 'CUSTOMER', 'CUSTOMER_INT');
-- 6) Swap under a short lock:
EXEC DBMS_REDEFINITION.FINISH_REDEF_TABLE('CUSTOMER_APP', 'CUSTOMER', 'CUSTOMER_INT', dml_lock_timeout => 60);
-- 7) Drop the interim table, which now holds the old structure:
DROP TABLE customer_app.customer_int PURGE;
-- On problems: EXEC DBMS_REDEFINITION.ABORT_REDEF_TABLE('CUSTOMER_APP', 'CUSTOMER', 'CUSTOMER_INT');
-- Status: SELECT * FROM dba_redefinition_status WHERE base_table_owner = 'CUSTOMER_APP';Ce que fait la commande
Modifie la structure d'une table (partitionnement, types/ordre des colonnes, tablespace, compression, paramètres LOB) pendant que l'application continue de tourner : les données sont copiées dans une table intermédiaire, les changements sont synchronisés via un MV log, et à la fin les noms sont échangés sous un verrou très bref.
Quand l'utiliser
Pour les changements qu'ALTER TABLE ne peut pas faire en ligne, comme partitionner sans interruption une grande table non partitionnée, changer le type d'une colonne ou convertir des LOB BasicFile en SecureFiles.
Attention
Exige Enterprise Edition (plus l'option Partitioning si la cible est partitionnée). Le processus nécessite deux fois l'espace de la table et ajoute une surcharge de redo et de MV log. FINISH prend un bref verrou exclusif ; les transactions longues le font attendre (dml_lock_timeout). Vérifiez toujours les erreurs de COPY_TABLE_DEPENDENTS dans DBA_REDEFINITION_ERRORS ; les FK peuvent être copiées en NOVALIDATE. Répétez d'abord dans un environnement de test.