V1.0
Revision |
Author/Modifier | Comments | |
No. |
Date |
||
1.0 | 2012.02 | 沈金 | 初稿 |
一、 目的
明确在线重定义操作的风险及标准流程,最大限度避免在线重定义操作带来的故障。
二、 适用范围
l 修改,删除表字段
l 修改表的物理参数:如tablespace,pctfree等
l 重组数据从而减少碎片
l 修改分区结构(10gR2)
l 修改普通表为IOT表,或相反
注:以下不支持online redefinition操作
表上有物化视图(10g开始可以)
表上有物化视图日志(11g开始可以)
IOT表有overflow table
使用BFILE,LONG 或用户自定义类型的表
三、 风险评估
l 需要重定义的表必须有PK,(BY ROWID 存在BUG)
l DBMS_REDEFINITION.START_REDEF_TABLE 此阶段不影响DML
l 周期的执行SYNC_INTERIM_TABLE从而保证物化视图日志不会过大的增长(重定义默认会为表创建物化视图日志)
l 在FINISH_REDEF_TABLE 完成之前,临时表上的触发器不会执行
l 完成后,原表相关的游标都会失效
l 统计信息无法拷贝(9i)
l FINISH_REDEF_TABLE 会被表上的DML阻塞
l 必须保证表空间足够
l 表上不能够存在长时间的事务,如果发生阻塞,建议KILL原事务
l 如果存在EROSA解析,需要重新解析原日志()?
四、 操作流程
1. 准备工作
a) 确认是否可以进行重定义:DBMS_REDEFINITION.can_redef_table
b) 确认表相关的触发器,约束(9i)
2. 执行过程
a) 创建空的临时表(和原表相似,修改必要的字段或物理属性)
b) (可选)开启并行:
i. alter session force parallel dml parallel degree-of-parallelism;
ii. alter session force parallel query parallel degree-of-parallelism;
c) 开启重定义:
DBMS_REDEFINITION.START_REDEF_TABLE (
uname IN VARCHAR2,
orig_table IN VARCHAR2,
int_table IN VARCHAR2,
col_mapping IN VARCHAR2 := NULL, –指定列的对应关系
options_flag IN BINARY_INTEGER := 1, –默认根据PK
orderby_cols IN VARCHAR2 := NULL, –根据某字段排序ASC/DESC(10g)
part_name IN VARCHAR2 := NULL); –分区(10g)
如果以上过程失败,可以调用DBMS_REDEFINITION.ABORT_REDEF_TABLE回滚
检查是否存在错误select * from dba_redefinition_errors;(10g)
d) 在临时表上创建需要的触发器,索引,约束和权限(9I)
推荐:自己整理脚本,并使用以下存储过程自动拷贝权限和统计信息
(可选 >9i)使用自动COPY;特点:重定义完成后,依赖对象名称不变
DECLARE
num_errors PLS_INTEGER;
BEGIN
DBMS_REDEFINITION.COPY_TABLE_DEPENDENTS
(uname =>‘ALP’,
orig_table =>‘TEST’,
int_table =>‘TEST_ONLINE_DEF’,
copy_indexes =>0, –不自动拷贝
copy_triggers =>FALSE,
copy_constraints =>FALSE,
copy_privileges =>TRUE,
ignore_errors =>TRUE, –遇到错误继续
num_errors =>num_errors,
copy_statistics => TRUE,
copy_mvlog => FALSE); –11g新
dbms_output.put_line(num_errors);
END;
/
检查是否存在错误select * from dba_redefinition_errors;(10g)
手动修正,如果还是需要保持依赖对象名称不变,可以通过运行DBMS_REDEFINITION.REGISTER_DEPENDENT_OBJECT进行手工注册?
e) 同步数据
DBMS_REDEFINITION.SYNC_INTERIM_TABLE
f) 结束在线重定义
DBMS_REDEFINITION.FINISH_REDEF_TABLE
3. 验证方案
a) 常规检查:@dbcheck
b) 数据库是否正常:@active
五、 核心对象风险
不建议使用
六、 回退方案
无需回退
七、 历史故障及教训
无