zoukankan      html  css  js  c++  java
  • 在线重定义 half

    在线重定义概念: 

          在线重定义(online Table RedefinItion),在重定义表结构的过程中不影响使用者,使用者仍然可以进行存取、新增、修改、删除等操作,是实现数据库高可用性一个很重要的方法。

    在oracle数据库提供一个 DBMS_REDEFINITION套件,下面是该套件里重要的程序:

    CAN_REDEF_TABLE

    START_REDEF_TABLE

    FINISH_REDEF_TABLE

    SYNC_INITERIM_TABLE

    ABSORT_REDEF_TABLE

    COPY_TABLE_DEPENDENTS

    REGISTER_DEPENDENTS_OBJECTS

    源表:
    create table  teacher(
      TNO    NUMBER(4),
      TNAME  VARCHAR2(10),
      SAL      NUMBER(10)
      )
    tablespace  temp

      pctfree 10
      initrans 1
      maxtrans 255
      storage
      (
        initial 64K
        minextents 1
        maxextents unlimited
      );

    那么该表想进行变更:

    1.增加索引 TNO  

    2.字段名称修改SAL 为TSAL 

    具体操作实践:

    1、验证能否表进行在线重定义

     默认为主键在线重定义的方式

    begin
     dbms_redefinition.can_redef_table('EPASSPORT','TEACHER');
     end;

    这种方式有时会提示错误:

    ORA-12089: 不能联机重新定义无主键的表 "EPASSPORT"."TEACHER"
    ORA-06512: 在 "SYS.DBMS_REDEFINITION", line 137
    ORA-06512: 在 "SYS.DBMS_REDEFINITION", line 1479
    ORA-06512: 在 line 2

    那么试试以rowid重定义

      begin
        dbms_redefinition.can_redef_table('EPASSPORT','TEACHER',2);
       end;

        /

        或者

        begin
        dbms_redefinition.can_redef_table('EPASSPORT','TEACHER',dbms_redefinition.cons_use_rowid );
        end;

    注: 

        cons_use_pk      CONSTANT PLS_INTEGER := 1;---主键重定义
        cons_use_rowid  CONSTANT PLS_INTEGER := 2;---rowid重定义

    2、创建中间表
    create table TEACHER_temp
    (
      TNO   NUMBER(4) not null,
      TNAME VARCHAR2(10),
      TSAL   NUMBER(10)
    )
    tablespace temp

      pctfree 10
      initrans 1
      maxtrans 255
      storage
      (
        initial 64K
        minextents 1
        maxextents unlimited
      );
    -- Create/Recreate primary, unique and foreign key constraints
    alter table TEACHER_temp
      add constraint TEACHER_INDEX1 primary key (TNO)
      using index
      tablespace temp
      pctfree 10
      initrans 2
      maxtrans 255
      storage
      (
        initial 64K
        minextents 1
        maxextents unlimited
      );

    3、开始进行重定义

    execute dbms_redefinition.start_redef_table('epassport','TEACHER','TEACHER_temp',null,2);

    注:输入参数说明        PROCEDURE start_redef_table

                                  (uname        IN VARCHAR2,----用户名
                                  orig_table   IN VARCHAR2,----源表名
                                  int_table    IN VARCHAR2,----中间表名
                                  col_mapping  IN VARCHAR2 := NULL,---源表和中间表列之间的映射,map;
                                  options_flag IN BINARY_INTEGER := 1,---重定义方式
                                  orderby_cols IN VARCHAR2 := NULL,---对于分区表重定义的时候,分区列名
                                  part_name    IN VARCHAR2 := NULL);---对于分区表重定义的时候,需要重定义的分区。其中最后2个参数没用到,因为这里是由普通表转换为分区表

    有时报错:

    ORA-00942: 表或视图不存在
    ORA-06512: 在 "SYS.DBMS_REDEFINITION", line 50
    ORA-06512: 在 "SYS.DBMS_REDEFINITION", line 1343
    ORA-06512: 在 line 1

    这个可能是权限问题

    4、保证数据的一致性

    execute dbms_redefinition.sync_interim_table ('epassport','TEACHER','TEACHER_temp');

    5、完成重定义
    execute dbms_redefinition.finish_redef_table('epassport','TEACHER','TEACHER_temp');

    desc TEACHER

    /

    6、删除中间表

    DROP TABLE epassport.'TEACHER_temp 

    注:

    结论:

    重定义的方式有2个按照rowid、主键;

    重定义的过程中可以对表进行DML操作;

    重定义的速度还是挺快的;

    重定义需要用户有一定系统权限(不知道是不是合适这么说)、需要一个中间表(中间表的结构、列名可以与be_organized的表不同)、重定义开始到重定义结束需要在中间表上建一系列约束;重定义完成之后的效果是:

    be_organized的表结构、约束信息与中间表的互相交换,二者数据量一致。

    可以普通表转为分区表;

    分区表也可以重定义

    注:转载

       

  • 相关阅读:
    数据库外键约束
    mysql查询数据
    操作mysql操作数据库
    自定义标签
    jstl标签
    getattibute 与 getparameter区别
    2017.3.2
    java中静态,抽象,接口,继承总结
    关于使用css伪类实现小图标
    动态生成的dom元素绑定事件
  • 原文地址:https://www.cnblogs.com/halfacre/p/2321938.html
Copyright © 2011-2022 走看看