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的表结构、约束信息与中间表的互相交换,二者数据量一致。

    可以普通表转为分区表;

    分区表也可以重定义

    注:转载

       

  • 相关阅读:
    null in ABAP and nullpointer in Java
    SAP ABAP SM50事务码和Hybris Commerce的线程管理器
    Hybris service layer和SAP CRM WebClient UI架构的横向比较
    SAP ABAP和Linux系统里如何检查网络传输的数据量
    SAP CRM WebClient UI和Hybris的controller是如何被调用的
    SAP CRM和Cloud for Customer订单中的业务伙伴的自动决定机制
    SAP CRM WebClient UI和Hybris CommerceUI tag的渲染逻辑
    SAP BSP和JSP页面里UI元素的ID生成逻辑
    微信jsapi支付
    微信jsapi退款操作
  • 原文地址:https://www.cnblogs.com/halfacre/p/2321938.html
Copyright © 2011-2022 走看看