`
vvnet
  • 浏览: 112358 次
  • 性别: Icon_minigender_1
  • 来自: 青岛
社区版块
存档分类
最新评论

在线重定义表(DBMS_REDEFINITION)

阅读更多
         在系统正在运行,外部有程序正在访问表的同时修改表的定义

         应用场景:对于7*24系统,不能直接修改表的定义,需要在保证正常使用的前提下修改表的定义、结构

         相关包:DBMS_REDEFINITION

执行在线重定义所需要权限:

         角色:EXECUTE_CATALOG_ROLE

         权限:CREATEANYTABLEALTERANYTABLEDROPANYTABLELOCKANYTABLESELECTANYTABLE

     例子:

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状态

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics