Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2385644
  • 博文数量: 384
  • 博客积分: 10193
  • 博客等级: 上将
  • 技术积分: 3785
  • 用 户 组: 普通用户
  • 注册时间: 2005-06-09 18:02
文章分类

全部博文(384)

文章存档

2011年(10)

2010年(29)

2009年(39)

2008年(36)

2007年(43)

2006年(198)

2005年(29)

分类: Oracle

2006-08-29 18:15:54

大部分翻译自Oracle 管理员指南, 并参考了 http://yangtingkun.itpub.net/post/468/12855
----------------------

Oracle的在线重定义表提供了一种显著增强系统可用性的机制, 在表的在线重定义过程中, 大部分时间对DML操作没有影响, 只有一小段时间里, 这个表以独占模式被锁定, 表以独占模式被锁定的时间是确定的, 和表的大小以及重定义的复杂程度无关.

在线重定义表可用于如下场合:

    修改表的存储参数
    在同一模式下将表移动到不同的表空间
    增加对并行查询的支持
    添加或删除分区
    重新创建表以减少分片
    将堆组织的表改变为索引组织表
    添加或删除列

在线重定义表由DBMS_REDEFINITION包完成, 执行这个包需要用户有EXECUTE_CATALOG_ROLE角色以及CREATE/ALTER/DROP/LOCK/SELECT ANY TABLE, CREATE ANY TRIGGER和CREATE ANY INDEX的权限.

表的在线重定义需要执行如下步骤:

    1. 选择在线重定义表的类型  在线重定义表分为两种类型:

    重定义的第一种方法是使用主键或者伪主键进行重定义。 伪主键是具有NOT NULL约束的列的组合, 在表中, 伪主键必须是唯一的, 也可以理解为伪主键是没有PRIMARY KEY约束的主键. 使用这种方法时, 重定义前后表的(伪)主键列必须相同. 这种方法更好一些, 并且也是默认的.

    重定义的第二种方法是使用rowid. 使用这种方法时, 表不能被重定义为索引组织表. 并且, 重定义后的表会有一个隐藏的列M_ROW$$, 重定义表后, 最好删除该列, 或将该列标识为UNUSED.

    2. 调用DBMS_REDEFINITION.CAN_REDEF_TABLE()过程验证这个表可被重定义   参数OPTIONS_FLAG指定要使用的重定义的方法.  如果这个表不可以被在线重定义, 这个过程会指明原因.

    3. 创建一个中间表  这个中间表和将被重定义的表在同一schema下, 其定义与重定义后的表相同.

    4. 调用DBMS_REDEFINITION.START_REDEF_TABLE()过程  参数如下: 被重定义的表, 中间表, 列影射关系, 重定义方法, 用语排序的列, 指定ORDER BY列.
   
    5. 在中间表上创建(克隆)依赖对象, 包括触发器, 索引, 授权, 约束. 可以使用COPY_TABLE_DEPENDENTS过程或者手工方式创建这些依赖对象.

    6. 执行DBMS_REDEFINITION.START_REDEF_TABLE()过程, 这个过程是可选的, 执行这一过程, 将会把在原始表上进行的DML操作在中间表上执行, 执行这一过程将减少在下一步骤执行的时间.
 
    7. 执行 DBMS_REDEFINITION.FINISH_REDEF_TABLE过程完成表的重定义. 在这个过程中, 将被重定义的表被以独占模式锁定, 这个过程与表中的数据无关. 但是FINISH_REDEF_TABLE将回等待所有依赖的DML操作完成, 才开始重定义操作.

    8. 可选, 删除rowid方式建立的隐藏列
M_ROW$$, 或者将该列设置为unused.

如果由于某些原因希望终止在线重定义表, 可使用DBMS_REDEFINITION.ABORT_REDEF_TABLE()过程.

在线重定义表的结果:

    原始表被重定义为中间表的属性和功能.

    在执行START_REDEF_TABLE()和执行FINISH_REDEF_TABLE()期间, 定义在中间表上的触发器, 授权, 索引以及约束将被定义在重定义后的表上. 引用中间表的参考约束将引用重定义后的表, 并且设置为enabled.

    定义在原始表上的触发器, 授权, 索引以及约束将被定义在中间表上, 删除中间表时, 这些对象将被删除. 引用原始表的参考性约束, 将引用中间表, 并被设置为disable.
    定义才原始表上的PL/SQL过程和游标, 将在下次使用时将重新验证.


阅读(2549) | 评论(0) | 转发(0) |
0

上一篇:<<棋子>>

下一篇:向多个监听器注册数据库

给主人留下些什么吧!~~