在线重定义表 .
??
???????? 7*24的业务运营系统中,对一个表进行在线重定义将是很棘手的事,因为业务实时的在对这个表进行进行插入,删除修改等操作;Oracle9i开始引入在线重定义表(Redefine Tables Online)的功能,通过调用dbms_redefinition包,可以在修改表结构的同时允许DML操作。
在线重定义表的主要功能:
2? 修改表的存储参数
2? 在同一个schema下将表移动到不同的tablespace
2? 增加并行查询支持
2? 添加或删除分区支持
2? 重建表以减少碎片
2? 将堆表变为索引组织表或相反
2? 添加或删除列
在线重定义表需要的权限:
execute_catalog_role
create any table
alter any table
drop any table
lock any table
select any table
在线重定义后的结果:
在线重定义的一些限制:
在线重定义的一般步骤:
EXEC DBMS_REDEFINITION.CAN_REDEF_TABLE('EDW', 'CTL_LOG', DBMS_REDEFINITION.CONS_USE_PK);
--检查原表是否满足在线重定义的条件
CREATE TABLE CTL_LOG_TMP
(ID?????? INTEGER PRIMARY KEY,
PROC_NAME VARCHAR2(32),
CTL_DEMO? VARCHAR2(36),
CTL_TIME? VARCHAR2(19),
MARK????? VARCHAR2(1000));
--中间表的表结构要与原表一致,可以新加列
EXEC DBMS_REDEFINITION.START_REDEF_TABLE('EDW', 'CTL_LOG','CTL_LOG_TMP','ID ID,PROC_NAME PROC_NAME,CTL_TIME CTL_TIME,CTL_DEMO CTL_DEMO');
--首先将临时表转换成一个以原表为基础的物化视图;表结构不完全一致也没关系,只要能映射正确即可
EXEC DBMS_REDEFINITION.SYNC_INTERIM_TABLE('EDW','CTL_LOG','CTL_LOG_TMP');
--可以选择执行一次或多次,同步中间表与原表的数据(为防止在表的重定义过程中,对源表进行的DML操作),缩短执行DBMS_REDEFINITION.FINISH_REDEF_TABLE时的锁表时间
EXEC DBMS_REDEFINITION.FINISH_REDEF_TABLE('EDW','CTL_LOG','CTL_LOG_TMP');
--将原表变成与手工新建的中间临时表表结构相同,并将中间临时表从物化视图再转换成表(与当初的原表结构相同)
DROP TABLE CTL_LOG_TMP;
EXEC DBMS_REDEFINITION.ABORT_REDEF_TABLE('EDW','CTL_LOG','CTL_LOG_TMP'); ?
--如果在线重定义失败,那么就必须必须调用DBMS_REDEFINITION.ABORT_REDEF_TABLE来释放快照。
说明:
一般会有这个需求,需要将在线大表(5G以上)更改为分区表,Dbms_Redefinition在线重定义非常慢,可能需要好几个小时,大表又是实时的业务操作,这就存在很大的失败风险。有人就曾经在线重定义过程中失败导致业务瘫痪,建议还是少用,或是不用,知道有这么回事就可以了。
个人觉得如下步骤比较保险,但是需要停机
a) export the table
b) create a new empty table that has the partition definition on it
c) import the table with IGNORE=Y
?
?
转:http://blog.csdn.net/nsj820/article/details/5752114