Oracle Online Redefinition 详解

Oracle Online Redefinition 详解

适用版本:Oracle Database 9i+ / 10g / 11g / 12c / 19c / 23ai 文档版本:v1.0 / 2026-07


1. 概述

Online Redefinition 在线重定义表[1]:

详细见:Oracle 在线重定义 DBMS_REDEFINITION


2. 优势

2.1 零停机

- 业务不停
- 表重定义
- 透明

2.2 变更

- 结构
- 存储
- 分区
- 压缩

3. 流程

3.1 检查

BEGIN
  DBMS_REDEFINITION.CAN_REDEF_TABLE(
    uname => 'SCOTT',
    tname => 'EMP',
    options_flag => DBMS_REDEFINITION.CONS_USE_PK
  );
END;
/

3.2 创建临时表

CREATE TABLE emp_int 
  PARTITION BY HASH (id) PARTITIONS 4
  AS SELECT * FROM emp WHERE 1=0;

3.3 开始重定义

BEGIN
  DBMS_REDEFINITION.START_REDEF_TABLE(
    uname => 'SCOTT',
    orig_table => 'EMP',
    int_table => 'EMP_INT',
    options_flag => DBMS_REDEFINITION.CONS_USE_PK
  );
END;
/

3.4 同步

BEGIN
  DBMS_REDEFINITION.SYNC_INTERIM_TABLE(
    uname => 'SCOTT',
    orig_table => 'EMP',
    int_table => 'EMP_INT'
  );
END;
/

3.5 依赖对象

DECLARE
  v_num PLS_INTEGER;
BEGIN
  DBMS_REDEFINITION.COPY_TABLE_DEPENDENTS(
    uname => 'SCOTT',
    orig_table => 'EMP',
    int_table => 'EMP_INT',
    num_errors => v_num
  );
END;
/

3.6 完成

BEGIN
  DBMS_REDEFINITION.FINISH_REDEF_TABLE(
    uname => 'SCOTT',
    orig_table => 'EMP',
    int_table => 'EMP_INT'
  );
END;
/

3.7 清理

DROP TABLE emp_int;

4. 中止

BEGIN
  DBMS_REDEFINITION.ABORT_REDEF_TABLE(
    uname => 'SCOTT',
    orig_table => 'EMP',
    int_table => 'EMP_INT'
  );
END;
/

5. 应用场景

5.1 分区

- 非分区转分区
- 在线
- 零停机

5.2 结构变更

- 列变更
- 类型
- 在线

5.3 存储

- 表空间迁移
- 压缩
- 在线

5.4 压缩

- OLTP 压缩
- 在线
- 节省空间

6. 限制

6.1 主键

- 需要主键
- 或 ROWID
- CONS_USE_PK / CONS_USE_ROWID

6.2 物化视图

- 物化视图限制
- 检查

6.3 资源

- 临时表空间
- Undo
- 监控

7. 物化视图日志

7.1 自动

- 重定义期间
- 自动创建
- 同步

7.2 清理

- 完成后自动
- 或手动

8. 监控

8.1 视图

SELECT * FROM dba_redefinition_errors;
SELECT * FROM dba_redefinition_objects;

8.2 进度

SELECT * FROM v$session_longops 
WHERE opname LIKE '%REDEFINITION%';

9. 性能

9.1 影响

- DML 性能
- 物化视图日志
- 监控

9.2 同步

- SYNC_INTERIM_TABLE
- 定期
- 减少完成时间

9.3 并行

- 并行
- 大表
- 加速

10. 常见问题

10.1 ORA-12091

- 物化视图存在
- 删除
- 重试

10.2 ORA-23539

- 已在重定义
- 检查

10.3 依赖错误

- COPY_TABLE_DEPENDENTS
- num_errors
- 检查

11. 最佳实践

  1. 测试:演练
  2. 备份:前
  3. 主键:必须
  4. 同步:定期
  5. 依赖:复制
  6. 监控:进度
  7. 低峰:执行
  8. 并行:大表
  9. 文档:流程
  10. 演练:定期

12. 参考资料

[1] Oracle Database Administrator’s Guide 19c, “Online Redefinition” https://docs.oracle.com/en/database/oracle/oracle-database/19/admin/