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. 最佳实践
- CAN_REDEF 检查:前提
- 业务低峰:影响小
- 多次 SYNC:减少完成时间
- COPY_TABLE_DEPENDENTS:完整
- 并行:性能
- 监控进度:及时
- 测试:可行
- ABORT 准备:应急
- 文档化:流程
- 验证数据:质量
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