• 通过DBMS_REDEFINITION包对表在线重定义


    基础介绍

    Oracle Online Redefinition可以保证在数据表进行DDL类型操作,如插入、删除数据列,分区处理的时候,还能够支持DML操作,特别是insert/update/delete操作。

    对一般的DDL过程而言,Oracle都会给数据对象一个独占表锁。也就是说,在进行DDL操作的过程中,我们是不能对数据表进行DML(增加、修改和删除操作)。只有等待DDL结束,才能够继续操作。

    也就是说,如果一个DDL持续时间很长,比如数据表海量大小,那么在这个长时间中,系统数据表其实是不能对外提供服务的。

    Oracle在线重定义提供了解决问题的途径。我们如果需要对一个数据表进行重定义,需要定义一个中间目标表Interim。在Interim表中定义好目标结构,比如期望的存储、分区、字段关系。在线重定义使用的主要是dbms_redefinition包的对应方法。

    在线重定义最大的特点是,当进行online操作的时候,我们还可以对数据表进行DML操作。结束定义过程时,期间进行的操作都是可以反馈到目标数据表中的。

    目前,Oracle在线重定义支持下列种类的重定义动作:

    • 插入、删除数据表列和对一个存在的数据表列改名
    • 修改字段类型;
    • 消除数据表段中的碎片块
    • 索引、约束等对象的重定义
    • 分区表转变;

    查看DBMS_REDEFINITION包的使用

    desc DBMS_REDEFINITION
    PROCEDURE ABORT_REDEF_TABLE
     Argument Name                  Type                    In/Out Default?
     ------------------------------ ----------------------- ------ --------
     UNAME                          VARCHAR2                IN
     ORIG_TABLE                     VARCHAR2                IN
     INT_TABLE                      VARCHAR2                IN
     PART_NAME                      VARCHAR2                IN     DEFAULT
    PROCEDURE CAN_REDEF_TABLE
     Argument Name                  Type                    In/Out Default?
     ------------------------------ ----------------------- ------ --------
     UNAME                          VARCHAR2                IN
     TNAME                          VARCHAR2                IN
     OPTIONS_FLAG                   BINARY_INTEGER          IN     DEFAULT
     PART_NAME                      VARCHAR2                IN     DEFAULT
    PROCEDURE COPY_TABLE_DEPENDENTS
     Argument Name                  Type                    In/Out Default?
     ------------------------------ ----------------------- ------ --------
     UNAME                          VARCHAR2                IN
     ORIG_TABLE                     VARCHAR2                IN
     INT_TABLE                      VARCHAR2                IN
     COPY_INDEXES                   BINARY_INTEGER          IN     DEFAULT
     COPY_TRIGGERS                  BOOLEAN                 IN     DEFAULT
     COPY_CONSTRAINTS               BOOLEAN                 IN     DEFAULT
     COPY_PRIVILEGES                BOOLEAN                 IN     DEFAULT
     IGNORE_ERRORS                  BOOLEAN                 IN     DEFAULT
     NUM_ERRORS                     BINARY_INTEGER          OUT
     COPY_STATISTICS                BOOLEAN                 IN     DEFAULT
     COPY_MVLOG                     BOOLEAN                 IN     DEFAULT
    PROCEDURE FINISH_REDEF_TABLE
     Argument Name                  Type                    In/Out Default?
     ------------------------------ ----------------------- ------ --------
     UNAME                           VARCHAR2               IN
     ORIG_TABLE                      VARCHAR2               IN
     INT_TABLE                       VARCHAR2               IN
     PART_NAME                       VARCHAR2               IN     DEFAULT
    PROCEDURE REGISTER_DEPENDENT_OBJECT
     Argument Name                  Type                    In/Out Default?
     ------------------------------ ----------------------- ------ --------
     UNAME                          VARCHAR2                IN
     ORIG_TABLE                     VARCHAR2                IN
     INT_TABLE                      VARCHAR2                IN
     DEP_TYPE                       BINARY_INTEGER          IN
     DEP_OWNER                      VARCHAR2                IN
     DEP_ORIG_NAME                  VARCHAR2                IN
     DEP_INT_NAME                   VARCHAR2                IN
    PROCEDURE START_REDEF_TABLE
     Argument Name                  Type                    In/Out Default?
     ------------------------------ ----------------------- ------ --------
     UNAME                          VARCHAR2                IN
     ORIG_TABLE                     VARCHAR2                IN
     INT_TABLE                      VARCHAR2                IN
     COL_MAPPING                    VARCHAR2                IN     DEFAULT
     OPTIONS_FLAG                   BINARY_INTEGER          IN     DEFAULT
     ORDERBY_COLS                   VARCHAR2                IN     DEFAULT
     PART_NAME                      VARCHAR2                IN     DEFAULT
    PROCEDURE SYNC_INTERIM_TABLE
     Argument Name                  Type                    In/Out Default?
     ------------------------------ ----------------------- ------ --------
     UNAME                          VARCHAR2                IN
     ORIG_TABLE                     VARCHAR2                IN
     INT_TABLE                      VARCHAR2                IN
     PART_NAME                      VARCHAR2                IN     DEFAULT
    PROCEDURE UNREGISTER_DEPENDENT_OBJECT
     Argument Name                  Type                    In/Out Default?
     ------------------------------ ----------------------- ------ --------
     UNAME                          VARCHAR2                IN
     ORIG_TABLE                     VARCHAR2                IN
     INT_TABLE                      VARCHAR2                IN
     DEP_TYPE                       BINARY_INTEGER          IN
     DEP_OWNER                      VARCHAR2                IN
     DEP_ORIG_NAME                  VARCHAR2                IN
     DEP_INT_NAME                   VARCHAR2                IN

    DBMS_REDEFINITION包:

    1. ABSORT_REDEF_TABLE:清理重定义的错误和中止重定义;
    2. CAN_REDEF_TABLE:检查表是否可以进行重定义,存储过程执行成功代表可以进行重定义;
    3. COPY_TABLE_DEPENDENTS:同步索引和依赖的对象(包括索引、约束、触发器、权限等);
    4. FINISH_REDEF_TABLE:完成在线重定义;
    5. REGISTER_DEPENDENTS_OBJECTS:注册依赖的对象,如索引、约束、触发器等;
    6. START_REDEF_TABLE:开始在线重定义;
    7. SYNC_INTERIM_TABLE:增量同步数据;
    8. UNREGISTER_DEPENDENT_OBJECT:不注册依赖的对象,如索引、约束、触发器等;

    举例说明

    下面,我们通过一个简单的例子,去看看如何使用dbms_redefinition包进行重定义操作。

    现有一张用户MIS_AUDIT下的业务表audit_log需要添加一字段,数据量为6361345,考虑到由于该表的数据量比较大,直接在原表上新增字段,执行的时间特别长,而且在新增字段的过程中,其他用户还不能访问该表,出现的等待事件是library cache lock。在此使用Oracle提供的DBMS_REDEFINITION包执行在线重定义表.

    1. 查看原表信息

    select count(*) from audit_log;                 #数据量
    
      COUNT(*)
    ----------
       6361345
    
    
    desc audit_log               #表结构
     Name                                           Null?    Type
     --------------------------------------------- --------  -----------------------------------
     AUDIT_LOG_ID                                  NOT NULL  NUMBER(38)
     PROCEDURE_ID                                  NOT NULL  NUMBER(38)
     PROCEDURE_DATE                                          DATE
     PROCESS_ID                                    NOT NULL  NUMBER(38)
     JOB_ID                                        NOT NULL  NUMBER(38)
     TASK_ID                                       NOT NULL  NUMBER(38)
     TYPE                                          NOT NULL  VARCHAR2(32)
     MESSAGE                                                 VARCHAR2(2000)
     STATUS                                        NOT NULL  VARCHAR2(32)
     CREATE_TIME                                   NOT NULL  DATE
     CREATED_BY                                    NOT NULL  VARCHAR2(64)
     
     
    column INDEX_NAME format a25
    column INDEX_TYPE format a20
    column TABLE_OWNER format a20
    column TABLE_NAME format a20
    column TABLE_TYPE format a20
    select INDEX_NAME,INDEX_TYPE,TABLE_OWNER,TABLE_NAME,TABLE_TYPE,STATUS from user_indexes where TABLE_NAME='AUDIT_LOG';     #该表对应的索引
    
    INDEX_NAME                INDEX_TYPE       TABLE_OWNER      TABLE_NAME       TABLE_TYPE       STATUS
    ------------------------- ---------------- ---------------- ---------------- ---------------- ------------------------
    IDX_AUDIT_LOG_TYPE_ID     NORMAL           MIS_AUDIT        AUDIT_LOG         TABLE            VALID
    IDX_ALOG_PROCESS_ID       NORMAL           MIS_AUDIT        AUDIT_LOG         TABLE            VALID
    IDX_ALOG_PROCEDURE_ID     NORMAL           MIS_AUDIT        AUDIT_LOG         TABLE            VALID
    PK_AUDIT_LOG              NORMAL           MIS_AUDIT        AUDIT_LOG         TABLE            VALID
    
    
    column CONSTRAINT_NAME format a15
    column CONSTRAINT_TYPE format a15
    column INVALID format a15
    column TABLE_NAME format a15
    column OWNER format a15
    select CONSTRAINT_NAME,CONSTRAINT_TYPE,STATUS,TABLE_NAME,OWNER from user_constraints where TABLE_NAME='AUDIT_LOG';       #该表对应的约束
    
    CONSTRAINT_NAME CONSTRAINT_TYPE STATUS             TABLE_NAME     OWNER
    --------------- --------------- ---------------- ----------- ---------------
    SYS_C0011415    C                ENABLED          AUDIT_LOG     MIS_AUDIT
    SYS_C0011416    C                ENABLED          AUDIT_LOG     MIS_AUDIT
    SYS_C0011417    C                ENABLED          AUDIT_LOG     MIS_AUDIT
    SYS_C0011418    C                ENABLED          AUDIT_LOG     MIS_AUDIT
    SYS_C0011419    C                ENABLED          AUDIT_LOG     MIS_AUDIT
    SYS_C0011420    C                ENABLED          AUDIT_LOG     MIS_AUDIT
    SYS_C0011421    C                ENABLED          AUDIT_LOG     MIS_AUDIT
    SYS_C0011422    C                ENABLED          AUDIT_LOG     MIS_AUDIT
    SYS_C0011423    C                ENABLED          AUDIT_LOG     MIS_AUDIT
    PK_AUDIT_LOG    P                ENABLED          AUDIT_LOG     MIS_AUDIT                         #该表拥有一个主键约束
    
    10 rows selected.

    2. 赋予用户MIS_AUDIT拥有在线重新定义表的权限

    使用Online Redefinition在线重定义需要用到DBMS_REDEFINITION程序包,EXECUTE_CATALOG_ROLE角色默认被赋予该PL/SQL Package的执行权限。除了执行该程序包的权限外,用户还需要拥有以下权限:

    •     CREATE ANY TABLE
    •     ALTER ANY TABLE
    •     DROP ANY TABLE
    •     LOCK ANY TABLE
    •     SELECT ANY TABLE

    若要执行COPY_TABLE_DEPENDENTS存储过程则还需要以下权限:

    •     CREATE ANY TRIGGER
    •     CREATE ANY INDEX
    grant EXECUTE_CATALOG_ROLE,CREATE ANY TABLE,ALTER ANY TABLE,DROP ANY TABLE,LOCK ANY TABLE,SELECT ANY TABLE,CREATE ANY TRIGGER,CREATE ANY INDEX to mis_audit;

    3. 查看该业务表是否支持在线重定义

    有两种在线重定义的方法.

    • 第一种是我们较为推荐的方式,采用Primary Key主键或者pseudoprimary key伪主键实施重定义(从Oracle 10g开始支持pseudoprimary key伪主键)。 这里pseudoprimary key伪主键要求是唯一键且所有的成员列均是非空NOT NULL。使用该种方式,重定义前和重定义后版本的表均必须有相同的Primary Key主键或者pseudoprimary key伪主键列。不管是从性能角度,还是从操作的复杂度考虑,常规场景中都推荐尽可能使用此种方式
    • 第二种方式是使用rowid进行redefinition。首先索引组织表index-organized table (IOT)不支持使用rowid的重定义方式。此外,若使用该种redefinition方式,最终会有一个隐藏的字段M_ROW$$被加入到重定义后版本的表上,Oracle官方推荐在重定义完成后将该M_ROW$$字段drop掉或者标记为unused。
    EXEC DBMS_REDEFINITION.CAN_REDEF_TABLE('MIS_AUDIT','AUDIT_LOG',DBMS_REDEFINITION.CONS_USE_ROWID);  #查看该表是否支持primary key方式重定义
    
    PL/SQL procedure successfully completed.
    
    EXEC DBMS_REDEFINITION.CAN_REDEF_TABLE('MIS_AUDIT','AUDIT_LOG',DBMS_REDEFINITION.CONS_USE_PK);      #查看该表是否支持ROWID方式重定义
    
    PL/SQL procedure successfully completed.

     4. 获取业务表的ddl语句

    EXECUTE DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM,'STORAGE',FALSE);
    EXECUTE DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM,'SQLTERMINATOR',True);
    EXECUTE DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM,'PRETTY',true);
    select dbms_metadata.get_ddl('TABLE','AUDIT_LOG','MIS_AUDIT') from dual;                                #获取业务表的DDl语句
    DBMS_METADATA.GET_DDL('TABLE','AUDIT_LOG','MIS_AUDIT')
    --------------------------------------------------------------------------------
    
      CREATE TABLE "MIS_AUDIT"."AUDIT_LOG"
       (    "AUDIT_LOG_ID" NUMBER(*,0) NOT NULL ENABLE,
        "PROCEDURE_ID" NUMBER(*,0) NOT NULL ENABLE,
        "PROCEDURE_DATE" DATE,
        "PROCESS_ID" NUMBER(*,0) NOT NULL ENABLE,
        "JOB_ID" NUMBER(*,0) NOT NULL ENABLE,
        "TASK_ID" NUMBER(*,0) NOT NULL ENABLE,
        "TYPE" VARCHAR2(32) NOT NULL ENABLE,
        "MESSAGE" VARCHAR2(2000),
        "STATUS" VARCHAR2(32) NOT NULL ENABLE,
        "CREATE_TIME" DATE NOT NULL ENABLE,
        "CREATED_BY" VARCHAR2(64) NOT NULL ENABLE,
         CONSTRAINT "PK_AUDIT_LOG" PRIMARY KEY ("AUDIT_LOG_ID")
      USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATIS
    TICS NOLOGGING
      TABLESPACE "TOOL"  ENABLE
       ) SEGMENT CREATION IMMEDIATE
      PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255
     NOCOMPRESS NOLOGGING
      TABLESPACE "TOOL" ;
    
    select dbms_metadata.get_ddl('CONSTRAINT','PK_AUDIT_LOG','MIS_AUDIT') from dual;                  #获取表的创建主键约束的语句
    
    DBMS_METADATA.GET_DDL('CONSTRAINT','PK_AUDIT_LOG','MIS_AUDIT')
    --------------------------------------------------------------------------------
    
      ALTER TABLE "MIS_AUDIT"."AUDIT_LOG" ADD CONSTRAINT "PK_AUDIT_LOG" PRIMARY K
    EY ("AUDIT_LOG_ID")
      USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE S
    TATISTICS NOLOGGING
      TABLESPACE "TOOL"  ENABLE;

    5.创建中间表AUDIT_LOG_TEMP

    修改建表语句,增加字段location,这里不要创建任何索引和主键约束信息,只要创建基本的表结构对象

    CREATE TABLE "MIS_AUDIT"."AUDIT_LOG_TEMP"(
        "AUDIT_LOG_ID" NUMBER(*,0) NOT NULL ENABLE,
        "PROCEDURE_ID" NUMBER(*,0) NOT NULL ENABLE,
        "PROCEDURE_DATE" DATE,
        "PROCESS_ID" NUMBER(*,0) NOT NULL ENABLE,
        "JOB_ID" NUMBER(*,0) NOT NULL ENABLE,
        "TASK_ID" NUMBER(*,0) NOT NULL ENABLE,
        "TYPE" VARCHAR2(32) NOT NULL ENABLE,
        "MESSAGE" VARCHAR2(2000),
        "STATUS" VARCHAR2(32) NOT NULL ENABLE,
        "CREATE_TIME" DATE NOT NULL ENABLE,
        "CREATED_BY" VARCHAR2(64) NOT NULL ENABLE,
        "LOCATION" VARCHAR2(256)
    );

    6.开始重定义过程

    set timing on
    begin
      DBMS_REDEFINITION.START_REDEF_TABLE(uname        => 'MIS_AUDIT',
                                          orig_table   => 'AUDIT_LOG',
                                          int_table    => 'AUDIT_LOG_TEMP',
                                          col_mapping  => 'AUDIT_LOG_ID AUDIT_LOG_ID,
                                                           PROCEDURE_ID PROCEDURE_ID,
                                                           PROCEDURE_DATE PROCEDURE_DATE,
                                                           PROCESS_ID PROCESS_ID,
                                                           JOB_ID JOB_ID,
                                                           TASK_ID TASK_ID,
                                                           TYPE TYPE,
                                                           MESSAGE MESSAGE,
                                                           STATUS STATUS,
                                                           CREATE_TIME CREATE_TIME,
                                                           CREATED_BY CREATED_BY',
                                          options_flag => DBMS_REDEFINITION.CONS_USE_PK);
    end;
    /
    
    PL/SQL procedure successfully completed.
    
    Elapsed: 00:02:01.18
    
    
    select count(*) from audit_log_temp;
    
      COUNT(*)
    ----------
       6361345
    
    select INDEX_NAME,INDEX_TYPE,TABLE_OWNER,TABLE_NAME,TABLE_TYPE,STATUS from user_indexes where TABLE_NAME='AUDIT_LOG_TEMP'; no rows selected Elapsed: 00:00:00.05

     若在完成重定义(执行finish_redef_table)之前希望中断在线重定义表,则需要使用DBMS_REDEFINITION.ABORT_REDEF_TABLE明确手动中断abort

    begin
      dbms_redefinition.abort_redef_table(uname      => 'MIS_AUDIT',
                                          orig_table => 'AUDIT_LOG',
                                          int_table  => 'AUDIT_LOG_TEMP');
    end;
    /
    
    PL/SQL procedure successfully completed.

    6.调用COPY_TABLE_DEPENDENTS过程克隆依赖对象

    (自动在AUDIT_LOG_TEMP表上创建触发器,索引,物化视图日志,授权和约束)

    DECLARE
          num_errors PLS_INTEGER;
        BEGIN
          DBMS_REDEFINITION.COPY_TABLE_DEPENDENTS(uname            => 'MIS_AUDIT',
                                                  orig_table       => 'AUDIT_LOG',
                                                  int_table        => 'AUDIT_LOG_TEMP',
                                                  copy_indexes     => DBMS_REDEFINITION.cons_orig_params,
                                                  copy_triggers    => TRUE,
                                                  copy_constraints => TRUE,
                                                  copy_privileges  => TRUE,
                                                  copy_statistics  => TRUE,
                                                  ignore_errors    => FALSE,
                                                  num_errors       => num_errors
                                                  );
       END;
    /
    
    DECLARE
    *
    ERROR at line 1:
    ORA-01442: column to be modified to NOT NULL is already NOT NULL
    ORA-06512: at "SYS.DBMS_REDEFINITION", line 1015
    ORA-06512: at "SYS.DBMS_REDEFINITION", line 1907
    ORA-06512: at line 4
    
    
    Elapsed: 00:01:49.43

    可以通过DBA_REDEFINITION_ERRORS视图来判断在使用COPY_TABLE_DEPENDENTS存储过程克隆依赖对象过程中是否产生了错误。该视图记录了重定义过程中在克隆依赖对象时产生的错误。 克隆对象可能因缺少系统资源或原表的一个逻辑结构变化而失败。在我们成功克隆这些依赖对象后,相关错误将会从该视图中被移除。 我们可以反复执行COPY_TABLE_DEPENDENTS尝试重新克隆依赖对象。

    column OBJECT_TYPE format a15
    column OBJECT_NAME format a15
    column DDL_TXT format a150
    select OBJECT_TYPE,OBJECT_NAME,DDL_TXT from DBA_REDEFINITION_ERRORS;
    
    OBJECT_TYPE     OBJECT_NAME     DDL_TXT
    --------------- --------------- ------------------------------------------------------------------------------------------------------------------------------------------------------
    CONSTRAINT       SYS_C0011622    ALTER TABLE "MIS_AUDIT"."AUDIT_LOG_TEMP" MODIFY ("JOB_ID" CONSTRAINT "TMP$$_SYS_C00116220" NOT NULL ENABLE NOVALIDATE)

    由于之前指定了主键,所以已经是not null 了,检查可以看到索引已经创建成功。

    select INDEX_NAME,INDEX_TYPE,TABLE_OWNER,TABLE_NAME,TABLE_TYPE,STATUS from user_indexes where TABLE_NAME='AUDIT_LOG_TEMP';
    
    INDEX_NAME                     INDEX_TYPE           TABLE_OWNER          TABLE_NAME     TABLE_TYPE            STATUS
    ------------------------------ -------------------- -------------------- --------------- -------------------- ------------------------
    TMP$$_IDX_AUDIT_LOG_TYPE_ID0   NORMAL               MIS_AUDIT            AUDIT_LOG_TEMP  TABLE                VALID
    TMP$$_IDX_ALOG_PROCESS_ID0     NORMAL               MIS_AUDIT            AUDIT_LOG_TEMP  TABLE                VALID
    TMP$$_IDX_ALOG_PROCEDURE_ID0   NORMAL               MIS_AUDIT            AUDIT_LOG_TEMP  TABLE                VALID
    TMP$$_PK_AUDIT_LOG0            NORMAL               MIS_AUDIT            AUDIT_LOG_TEMP  TABLE                VALID
    
    Elapsed: 00:00:00.00

    此时查看临时表的约束,发现主键约束并没有同步过来,

    select CONSTRAINT_NAME,CONSTRAINT_TYPE,STATUS,TABLE_NAME,OWNER from user_constraints where TABLE_NAME='AUDIT_LOG_TEMP';
    
    CONSTRAINT_NAME CONSTRAINT_TYPE STATUS             TABLE_NAME     OWNER
    --------------- --------------- ------------------------ --------------- ---------------
    SYS_C0011656    C        ENABLED          AUDIT_LOG_TEMP  MIS_AUDIT
    SYS_C0011657    C        ENABLED          AUDIT_LOG_TEMP  MIS_AUDIT
    SYS_C0011658    C        ENABLED          AUDIT_LOG_TEMP  MIS_AUDIT
    SYS_C0011659    C        ENABLED          AUDIT_LOG_TEMP  MIS_AUDIT
    SYS_C0011660    C        ENABLED          AUDIT_LOG_TEMP  MIS_AUDIT
    SYS_C0011661    C        ENABLED          AUDIT_LOG_TEMP  MIS_AUDIT
    SYS_C0011662    C        ENABLED          AUDIT_LOG_TEMP  MIS_AUDIT
    SYS_C0011663    C        ENABLED          AUDIT_LOG_TEMP  MIS_AUDIT
    SYS_C0011664    C        ENABLED          AUDIT_LOG_TEMP  MIS_AUDIT
    
    9 rows selected.
    
    Elapsed: 00:00:00.00

    7. 利用sync_interim_table过程同步临时表的数据减少finish_redef_table的耗时

    BEGIN 
      DBMS_REDEFINITION.SYNC_INTERIM_TABLE('MIS_AUDIT', 'AUDIT_LOG', 'AUDIT_LOG_TEMP');
    END;
    /
    
    PL/SQL procedure successfully completed.
    
    Elapsed: 00:00:00.07

    8. 执行finish_redef_table过程完成重定义

    最后使用finish_redef_table来将两个表的名互换,以实现功能重定义的功能。原表更名为了中间表AUDIT_LOG_TEMP,可以Drop掉了。

    BEGIN 
       DBMS_REDEFINITION.FINISH_REDEF_TABLE('MIS_AUDIT', 'AUDIT_LOG', 'AUDIT_LOG_TEMP');
    END;
     /
    
    PL/SQL procedure successfully completed.
    
    Elapsed: 00:00:03.21

    9. 查看原表信息确认在线定义已经完成

    desc audit_log
     Name                                           Null?    Type
     ----------------------------------------------------- --------  ------------------------------------
     AUDIT_LOG_ID                                    NOT NULL   NUMBER(38)
     PROCEDURE_ID                                    NOT NULL   NUMBER(38)
     PROCEDURE_DATE                                         DATE
     PROCESS_ID                                     NOT NULL   NUMBER(38)
     JOB_ID                                        NOT NULL   NUMBER(38)
     TASK_ID                                       NOT NULL   NUMBER(38)
     TYPE                                           NOT NULL   VARCHAR2(32)
     MESSAGE                                              VARCHAR2(2000)
     STATUS                                         NOT NULL   VARCHAR2(32)
     CREATE_TIME                                     NOT NULL    DATE
     CREATED_BY                                     NOT NULL   VARCHAR2(64)
     LOCATION                                               VARCHAR2(256)
    
    MIS_AUDIT@userdata>select count(*) from audit_log;
    
      COUNT(*)
    ----------
       6361345
    
    Elapsed: 00:00:00.49
    
    
    select INDEX_NAME,INDEX_TYPE,TABLE_OWNER,TABLE_NAME,TABLE_TYPE,STATUS from user_indexes where TABLE_NAME='AUDIT_LOG';
    
    INDEX_NAME                     INDEX_TYPE           TABLE_OWNER          TABLE_NAME      TABLE_TYPE           STATUS
    ------------------------------ -------------------- -------------------- --------------- -------------------- ------------------------
    IDX_AUDIT_LOG_TYPE_ID           NORMAL              MIS_AUDIT            AUDIT_LOG       TABLE                VALID
    IDX_ALOG_PROCESS_ID             NORMAL              MIS_AUDIT            AUDIT_LOG       TABLE                VALID
    IDX_ALOG_PROCEDURE_ID           NORMAL              MIS_AUDIT            AUDIT_LOG       TABLE                VALID
    PK_AUDIT_LOG                    NORMAL              MIS_AUDIT            AUDIT_LOG       TABLE                VALID

     10.删除临时表的主键约束并添加主键约束到原表

    select CONSTRAINT_NAME,CONSTRAINT_TYPE,STATUS,TABLE_NAME,OWNER from user_constraints where TABLE_NAME='AUDIT_LOG';
    
    CONSTRAINT_NAME CONSTRAINT_TYPE STATUS                   TABLE_NAME      OWNER
    --------------- --------------- ------------------------ --------------- ---------------
    SYS_C0011656    C               ENABLED                  AUDIT_LOG       MIS_AUDIT
    SYS_C0011657    C               ENABLED                  AUDIT_LOG       MIS_AUDIT
    SYS_C0011658    C               ENABLED                  AUDIT_LOG       MIS_AUDIT
    SYS_C0011659    C               ENABLED                  AUDIT_LOG       MIS_AUDIT
    SYS_C0011660    C               ENABLED                  AUDIT_LOG       MIS_AUDIT
    SYS_C0011661    C               ENABLED                  AUDIT_LOG       MIS_AUDIT
    SYS_C0011662    C               ENABLED                  AUDIT_LOG       MIS_AUDIT
    SYS_C0011663    C               ENABLED                  AUDIT_LOG       MIS_AUDIT
    SYS_C0011664    C               ENABLED                  AUDIT_LOG       MIS_AUDIT
    
    9 rows selected.
    
    Elapsed: 00:00:00.05
    
    select CONSTRAINT_NAME,CONSTRAINT_TYPE,STATUS,TABLE_NAME,OWNER from user_constraints where TABLE_NAME='AUDIT_LOG_TEMP';
    
    CONSTRAINT_NAME CONSTRAINT_TYPE STATUS                   TABLE_NAME      OWNER
    --------------- --------------- ------------------------ --------------- ---------------
    SYS_C0011622    C               ENABLED                  AUDIT_LOG_TEMP  MIS_AUDIT
    SYS_C0011623    C               ENABLED                  AUDIT_LOG_TEMP  MIS_AUDIT
    SYS_C0011624    C               ENABLED                  AUDIT_LOG_TEMP  MIS_AUDIT
    SYS_C0011625    C               ENABLED                  AUDIT_LOG_TEMP  MIS_AUDIT
    SYS_C0011626    C               ENABLED                  AUDIT_LOG_TEMP  MIS_AUDIT
    SYS_C0011627    C               ENABLED                  AUDIT_LOG_TEMP  MIS_AUDIT
    PK_AUDIT_LOG    P               ENABLED                  AUDIT_LOG_TEMP  MIS_AUDIT
    SYS_C0011619    C               ENABLED                  AUDIT_LOG_TEMP  MIS_AUDIT
    SYS_C0011620    C               ENABLED                  AUDIT_LOG_TEMP  MIS_AUDIT
    SYS_C0011621    C               ENABLED                  AUDIT_LOG_TEMP  MIS_AUDIT
    
    10 rows selected.
    
    Elapsed: 00:00:00.00
    
    alter table AUDIT_LOG_TEMP drop constraint PK_AUDIT_LOG;
    
    Table altered.
    
    ALTER TABLE "MIS_AUDIT"."AUDIT_LOG" ADD CONSTRAINT "PK_AUDIT_LOG" PRIMARY KEY ("AUDIT_LOG_ID");
    
    Table altered.
    
    Elapsed: 00:00:00.09
    
    select CONSTRAINT_NAME,CONSTRAINT_TYPE,STATUS,TABLE_NAME,OWNER from user_constraints where TABLE_NAME='AUDIT_LOG';
    
    CONSTRAINT_NAME CONSTRAINT_TYPE STATUS                   TABLE_NAME      OWNER
    --------------- --------------- ------------------------ --------------- ---------------
    PK_AUDIT_LOG    P               ENABLED                  AUDIT_LOG       MIS_AUDIT
    SYS_C0011656    C               ENABLED                  AUDIT_LOG       MIS_AUDIT
    SYS_C0011657    C               ENABLED                  AUDIT_LOG       MIS_AUDIT
    SYS_C0011658    C               ENABLED                  AUDIT_LOG       MIS_AUDIT
    SYS_C0011659    C               ENABLED                  AUDIT_LOG       MIS_AUDIT
    SYS_C0011660    C               ENABLED                  AUDIT_LOG       MIS_AUDIT
    SYS_C0011661    C               ENABLED                  AUDIT_LOG       MIS_AUDIT
    SYS_C0011662    C               ENABLED                  AUDIT_LOG       MIS_AUDIT
    SYS_C0011663    C               ENABLED                  AUDIT_LOG       MIS_AUDIT
    SYS_C0011664    C               ENABLED                  AUDIT_LOG       MIS_AUDIT
       
    10 rows selected.
    
    Elapsed: 00:00:00.01

    参考

    http://blog.itpub.net/23135684/viewspace-1765128/

    http://www.askmaclean.com/archives/know-oracle-online-redefinition.html

    http://debugo.com/%E4%BD%BF%E7%94%A8%E5%9C%A8%E7%BA%BF%E9%87%8D%E5%AE%9A%E4%B9%89%E6%94%B9%E5%8F%98%E8%A1%A8%E7%9A%84%E6%89%80%E5%9C%A8%E8%A1%A8%E7%A9%BA%E9%97%B4/

    http://blog.itpub.net/24930246/viewspace-2063727/

  • 相关阅读:
    Arr
    class4
    class3联大网页
    class33
    class3
    人机交换 NO 1书签
    大数据的框架与特点
    mapreduce排序
    mapreduce求平均数
    mapreduce去重
  • 原文地址:https://www.cnblogs.com/ilifeilong/p/7630194.html
Copyright © 2020-2023  润新知