DBAtlas · Database operations atlas

Redefine a table online with DBMS_REDEFINITION (full flow)

OracleOnline Operations

Command

-- 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';

What it does

Changes a table's structure (partitioning, column types/order, tablespace, compression, LOB settings) while the application keeps running: data is copied to an interim table, changes are synchronized through an MV log, and at the end the names are swapped under a very short lock.

When to use it

For changes that ALTER TABLE cannot do online, such as partitioning a large non-partitioned table without downtime, changing a column type, or converting BasicFile LOBs to SecureFiles.

Caution

Requires Enterprise Edition (plus the Partitioning option if the target is partitioned). The process needs twice the table's space and adds redo and MV log overhead. FINISH takes a brief exclusive lock; long-running transactions make it wait (dml_lock_timeout). Always check COPY_TABLE_DEPENDENTS errors in DBA_REDEFINITION_ERRORS; FKs may be copied as NOVALIDATE. Rehearse in a test environment first.

Open in DBAtlas →

Related