应用场景:对于7*24系统,不能直接修改表的定义,需要在保证正常使用的前提下修改表的定义、结构
相关包:DBMS_REDEFINITION
执行在线重定义所需要权限:
角色:EXECUTE_CATALOG_ROLE
权限:CREATEANYTABLE、ALTERANYTABLE、DROPANYTABLE、LOCKANYTABLE、SELECTANYTABLE
例子:
1.ALTER INDEX PK_TAB1 RENAME TO PK_T_TAB1;
2.ALTERT TABLE TAB1 RENMAE PK_TAB1 TO PK_T_TAB1;
3.创建分区表T_TAB1
4.
BEGIN
DBMS_REDEFINITION.CAN_REDEF_TABLE(UNAME=>'TEST',TNAME=>'TAB1',OPTIONS_FLAG=>DBMS_REDEFINITION.CONS_USE_PK);
DBMS_REDEFINITION.START_REDEF_TABLE (uname=>'TEST',orig_table=>'TAB1',int_table=>'T_TAB1',options_flag=>dbms_redefinition.cons_use_pk);
DBMS_REDEFINITION.FINISH_REDEF_TABLE(uname=>'TEST',orig_table=>'TAB1',int_table=>'T_TAB1');
END;
*******************************************************
在线重定义的功能:
修改表的存储参数
可以将表转移到其他表空间
增加并行查询选项
增加或删除分区
重建表以减少碎片
将堆表改为索引组织表或相反的操作
增加或删除一个列
在线重定义的原理:
物化视图
在线重定义表的步骤:
1、选择一种重定义方法:一种是基于主键、另一种是基于ROWID
2、调用DBMS_REDEFINITION.CAN_REDEF_TABLE过程,如果表不满足重定义的条件,将会报错并给出原因
3、在同一个方案中建立一个空的中间表,根据重定义后你期望得到的结构建立中间表
4、调用DBMS_REDEFINITION.START_REDEF_TABLE过程,并提供下列参数:被重定义的表的名称、中间表的名称、列的映射规则、重定义方法
如果映射方法没有提供,则认为所有包括在中间表中的列用于表的重定义。如果给出了映射方法,则只考虑映射方法中给出的列。如果没有给出重定义方法,则认为使用主键方式
5、在中间表上建立触发器、索引和约束,并进行相应的授权。任何包含中间表的完整性约束应将状态置为DISABLE
当重定义完成时,中间表上建立的触发器、索引、约束和授权将替换重定义表上的触发器、索引、约束和授权。中间表上DISABLE的约束将在重定义表上ENABLE
6、如果在执行完成DBMS_REDEFINITION.START_REDEF_TABLE过程后,立即执行DBMS_REDEFINITION.FINISH_REDEF_TABLE过程,这会导致在重定义表上执行了大量的DML操作,那么可以选择执行一次或多次的DBMS_REDEFINITION.SYNC_INTERIM_TABLE过程,以减少最后一步执行FINISH_REDEF_TABLE过程时的锁定时间
7、执行DBMS_REDEFINITION.FINISH_REDEF_TABLE过程完成表的重定义。这个过程中,原始表会被独占模式锁定一小段时间,具体时间和表的数据量有关
执行完FINISH_REDEF_TABLE过程后,原始表重定义后具有了中间表的属性、索引、约束、授权和触发器。中间表上DISABLE的约束在原始表上处于ENABLE状态
*******************************************************
依赖对象的状态:
依赖对象:约束、触发器、索引、授权
中间表:定义中间表,在该中间表建立的触发器、约束应该将其置为DISABLE状态
目的表:在重定义过程完毕以后,中间表的这些依赖对象将会自动转移到目标表上,并且为ENABLE状态