Oracle 在线重定义

Oracle 在线重定义

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


1. 概述

在线重定义允许生产表在线重组[1]:

用途

  • 修改表结构
  • 重组表空间
  • 分区改造
  • 压缩转换

详细见:Oracle 在线重定义 DBMS_REDEFINITION


2. 限制

2.1 不可重定义

  • 物化视图容器
  • 物化视图日志表
  • IOT(部分)
  • AQ 队列表
  • 临时表

2.2 必要

  • 主键或 rowid
  • 足够空间

3. 流程

3.1 检查

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

3.2 创建中间表

CREATE TABLE employees_interim (
  id NUMBER PRIMARY KEY,
  name VARCHAR2(100),
  salary NUMBER,
  dept_id NUMBER,
  created_at DATE DEFAULT SYSDATE
)
PARTITION BY RANGE (created_at) (
  PARTITION p2024 VALUES LESS THAN (TO_DATE('2025-01-01', 'YYYY-MM-DD')),
  PARTITION p2025 VALUES LESS THAN (TO_DATE('2026-01-01', 'YYYY-MM-DD')),
  PARTITION p2026 VALUES LESS THAN (MAXVALUE)
)
COMPRESS FOR OLTP;

3.3 启动重定义

BEGIN
  DBMS_REDEFINITION.START_REDEF_TABLE(
    uname => 'SCOTT',
    orig_table => 'EMPLOYEES',
    int_table => 'EMPLOYEES_INTERIM',
    col_mapping => 'id id, name name, salary salary, dept_id dept_id, created_at created_at',
    options_flag => DBMS_REDEFINITION.CONS_USE_PK
  );
END;
/

3.4 依赖对象

BEGIN
  DBMS_REDEFINITION.COPY_TABLE_DEPENDENTS(
    uname => 'SCOTT',
    orig_table => 'EMPLOYEES',
    int_table => 'EMPLOYEES_INTERIM',
    copy_indexes => DBMS_REDEFINITION.CONS_ORIG_PARAMS,
    copy_triggers => TRUE,
    copy_constraints => TRUE,
    copy_privileges => TRUE,
    num_errors => 0
  );
END;
/

3.5 同步

-- 多次同步(可选)
BEGIN
  DBMS_REDEFINITION.SYNC_INTERIM_TABLE(
    uname => 'SCOTT',
    orig_table => 'EMPLOYEES',
    int_table => 'EMPLOYEES_INTERIM'
  );
END;
/

3.6 完成

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

3.7 清理

DROP TABLE employees_interim;

4. 选项

4.1 CONS_USE_PK

options_flag => DBMS_REDEFINITION.CONS_USE_PK
-- 需要主键

4.2 CONS_USE_ROWID

options_flag => DBMS_REDEFINITION.CONS_USE_ROWID
-- 无主键

5. 模式

5.1 完全重定义

- 表名互换
- 原表变中间表
- 中间表变原表

5.2 滚动升级

- 主备 / RAC
- 滚动
- 减少停机

6. 应用场景

6.1 表分区

-- 单表 → 分区
CREATE TABLE employees_interim (...) 
PARTITION BY RANGE (hire_date) (...);

-- 重定义
DBMS_REDEFINITION.START_REDEF_TABLE(...);

6.2 压缩

-- 不压缩 → 压缩
CREATE TABLE employees_interim (...) COMPRESS FOR OLTP;

DBMS_REDEFINITION.START_REDEF_TABLE(...);

详细见:Oracle 表压缩技术

6.3 表空间迁移

-- 表空间迁移
CREATE TABLE employees_interim (...) TABLESPACE new_ts;

DBMS_REDEFINITION.START_REDEF_TABLE(...);

6.4 列修改

-- 增/删/改列
CREATE TABLE employees_interim (
  id NUMBER,
  new_name VARCHAR2(200),  -- 新列
  salary NUMBER,
  -- 删除 old_col
  ...
);

DBMS_REDEFINITION.START_REDEF_TABLE(
  ...,
  col_mapping => 'id id, name new_name, salary salary'
);

7. 性能

7.1 物化视图日志

- 重定义期间
- 捕获变更
- 应用到中间表

7.2 同步频率

- 多次 SYNC
- 减少完成时间
- 业务低峰完成

7.3 并行

ALTER SESSION FORCE PARALLEL DML PARALLEL 8;
ALTER SESSION FORCE PARALLEL QUERY PARALLEL 8;

DBMS_REDEFINITION.START_REDEF_TABLE(...);

8. 监控

8.1 进度

SELECT * FROM dba_redefinition_tables;

8.2 错误

-- COPY_TABLE_DEPENDENTS 错误
-- num_errors 输出参数

9. 中断

9.1 ABORT

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

9.2 清理

DROP TABLE employees_interim;
-- 物化视图日志自动清理

10. 注意事项

10.1 业务影响

- 在线但有锁
- 短期排他锁
- 业务低峰

10.2 空间

- 中间表空间
- 索引空间
- 物化视图日志

10.3 依赖

- 索引 / 约束 / 触发器
- 权限
- 复制依赖对象

11. 常见坑与排错

11.1 ORA-12091

- 物化视图日志存在
- DROP MATERIALIZED VIEW LOG ON ...

11.2 ORA-23515

- 物化视图容器
- 不可重定义

11.3 依赖错误

- num_errors > 0
- 检查无效对象
- 手动修复

12. 最佳实践

  1. CAN_REDEF 检查:前提
  2. 业务低峰:影响小
  3. 多次 SYNC:减少完成时间
  4. COPY_TABLE_DEPENDENTS:完整
  5. 并行:性能
  6. 监控进度:及时
  7. 测试:可行
  8. ABORT 准备:应急
  9. 文档化:流程
  10. 验证数据:质量

13. 参考资料

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