Oracle 支持在线重定义表,也就是说我们可以在修改表结构(DDL)的同时进行相关的DQL、DML操作,使得前端的DML根本感觉不到表结构实际上已经发生了变化,对于用户而言是完全透明的。当然在线重定义期间,前端性能会稍微有所下降。Oracle提供的重定义包dbms_redefinition即是用与完成此操作。其实质是Oracle使用了智能物化视图及物化视图日志的方式。在对象结构重组期间,表现为一个本地对象的复制,重组期间发生的任何变化都会被刷新到最新。
--------------------------------------------------------------------------------
在CentOS 6.4下安装Oracle 11gR2(x64)
--------------------------------------------------------------------------------
1、在线重定义表的主要功能:
修改表或簇的存储参数
将表移动到相同或不同schema下不同的tablespace(如果不要求表始终可用的话,也可以直接使用alter table move 实现)
为表添加,修改或删除列
为表添加或删除分区,改变分区结构
改变物化视图日志或者Streams Advanced Queuing queue 表结构
增加并行查询支持
重建表以减少碎片
将堆表变为索引组织表或相反
2、图示在线重定义
下面的图示便于理解是如何进行在线重定义,其本质是基于基表的一个快照
3、在线重定义的步骤
a、选择在线重定义的方式,基于键(主键或唯一键)还是rowid(无主键或唯一键的情形)
b、校验表能否被在线重定义,使用过程CAN_REDEF_TABLE
c、创建用于在线重定义的临时表(该临时表使用新的表结构,即添加删除列,列长度变化,存储属性变化等)
d、如果重定义的为分区表且使用rowid方式,应该为临时表开启行移动(ALTER TABLE ... ENABLE ROW MOVEMENT;)
e、对于大型表的在线重定义可以通过启用并行以提高性能(此步骤可选)
ALTER SESSION FORCE PARALLEL DML PARALLEL degree-of-parallelism;
ALTER SESSION FORCE PARALLEL QUERY PARALLEL degree-of-parallelism;
f、调用过程start_redef_table启动在线重定义,如果启动失败,应调用ABORT_REDEF_TABLE先终止查找原因后再次启动
g、从被重定义的表复制依赖对象到临时表(triggers, indexes, materialized view logs, grants, and constraints)及统计信息到临时表
h、同步被重定义的表到临时表(调用过程sync_interim_table,此步可选)
i、调用过程FINISH_REDEF_TABLE完成表的在线重订义