一、在线重定表介绍
对24*7运行的系统,如果因业务调整,需要对某些表增加字段,或者把重新想把常规的表进行分区,这时可用ooracle提供的包dbms_redefinition包达到目的。
dbms_redefinition可以完成以下工作:
-
修改table或者cluster的存储参数
-
移动table或者cluster到不同的表空间
-
增加、修改、删除table或者cluster的一列或列
-
增加或者删除分区(仅支持非cluster table)
-
改变分区结构
-
改变一个单表分区的物理属性,包括移动到同一个模式下不同的表空间
-
增加并行查询(parallel queries)的支持
-
重新创建table or cluster用来减少碎片
-
把堆表(heat table)变成索引组织表(IOT),或者做反向操作
-
转换一个关系表到一张表中的object column,或者做反向操作
-
转换object table到一张关系表或者表中的object column,或者做反向操作
在线重定义表有两种方式,key或者rowid
(1)通过key的方式要求选择一个主键(primary key)或者伪主键(pseudo-primary key)用来重定义表,这种方法要求重定义前和重定义后有相同的主键,这也是默认重定义表的方法。
(2)如果没有主键可用,可选择通过rowid的方式重定义表。这种方法会添加名为M_ROW$$的隐藏列到重定义表,推荐再重定义表完成后删除此列或者设置成unused。如果COMPATIBLE参数设置10.2.0或者更高,在重定义阶段会自动设置成unsed,可以在使用ALTER TABLE ... DROP UNUSED COLUMNS删除他。如果是索引组织表不能使用rowid的方式。
二、在线重定表步骤
在线重定义表有以下几步:
1.调用过程CAN_REDEF_TABLE验证表是否可以实施在线重定义,验证结果如果不能在重定义会报错并提示原因。
2.创建一个空的中间表(与要重定义的表在同一 schema),表包含希望有的逻辑和物理属性。如果有列要删除,中间表不要包含删除的列。不需要在中间表上定义所有的索引、约束、grants、触发器,当复制依赖的对象时会自动定义。
3.如果使用rowid方法重定义分区表,要在中间表上开启行移动。
later table … enable row movement;