zoukankan      html  css  js  c++  java
  • oracle在线重定义(一)

    一、废话几句:

    关于pd12导出图像,

    首先ctrl+A全选
    然后:edit->Export Image——>emf格式为默认,实则任选就OK了;

    下午时隔4个月再次画ER图,相对的感觉要熟练很多,很多功能也都晓得了,但是不好的是对需求把握不到,粗糙,慢慢来,take it easy.

    二、普通表转换为分区表的做法:其中一种便是使用oracle自带的包进行重定义,简单测试一下,感觉还比较好用;但是出现了一个问题:①需要有相应的系统权限(待查,目前用的是sys用户测试);②是否表一定要有主键才能进行重定义?还是至少需要索引?按照重定义的方式来说,默认按照主键;可选择的为rowid;

    包中的定义,可以用pl/sql工具看下包dbms_redefinition的用法

      -- Constants for the options_flag parameter of start_redef_table
      cons_use_pk    CONSTANT PLS_INTEGER := 1;---主键重定义
      cons_use_rowid CONSTANT PLS_INTEGER := 2;---rowid重定义

     config:源表LOGIN_USER_DETAIL数据量考虑,需要转换为分区表;

     CREATE TABLE EDU.LOGIN_USER_DETAIL
     (
        ID          NUMBER(10)    NOT NULL,
        WEB_ID      NUMBER(8)         NULL,
        TICKET      VARCHAR2(40)      NULL,
        STATUS      NUMBER(2)     DEFAULT 0 NOT NULL,
        CLIENT_INFO VARCHAR2(100)     NULL,
        SERVER_NAME VARCHAR2(40)      NULL,
        CREATE_DATE DATE              NULL
     )

     /

     CREATE INDEX EDU.IDX_WEBID_TICKET_CLINFO
     ON EDU.LOGIN_USER_DETAIL(WEB_ID,TICKET,CLIENT_INFO)

    步骤一、测试能否表进行在线重定义,

     begin
     dbms_redefinition.can_redef_table('edu','LOGIN_USER_DETAIL');
     end;

    出现错误

    ORA-12089: cannot online redefine table "EDU"."LOGIN_USER_DETAIL" with no primary key
    ORA-06512: at "SYS.DBMS_REDEFINITION", line 50
    ORA-06512: at "SYS.DBMS_REDEFINITION", line 1343
    ORA-06512: at line 2

    原因是默认为主键在线重定义的方式,需要设定参数为2,按照rowid重定义;

        begin
        dbms_redefinition.can_redef_table('edu','LOGIN_USER_DETAIL',2);
        end;

        /

        或者

        begin
        dbms_redefinition.can_redef_table('edu','LOGIN_USER_DETAIL',dbms_redefinition.cons_use_rowid );
        end;

    PL/SQL procedure successfully completed

    步骤二、创建中间表

     create table edu.LOGIN_USER_DETAIL_new(
        ID          NUMBER(10)    NOT NULL,
        WEB_ID      NUMBER(8)         NULL,
        TICKET      VARCHAR2(40)      NULL,
        STATUS      NUMBER(2)     DEFAULT 0 NOT NULL,
        CLIENT_INFO VARCHAR2(100)     NULL,
        SERVER_NAME VARCHAR2(40)      NULL,
        CREATE_DATE DATE              NULL
     )
    PARTITION BY RANGE(CREATE_DATE)
    ( PARTITION part23 VALUES LESS THAN (TO_DATE('2010-09-24', 'YYYY-MM-DD')),
      PARTITION part24 VALUES LESS THAN (TO_DATE('2010-09-25', 'YYYY-MM-DD')),
      PARTITION Part25 VALUES LESS THAN (TO_DATE('2010-09-26', 'YYYY-MM-DD')),
      PARTITION partmax VALUES LESS THAN (MAXVALUE)
    );

    步骤三、开始进行重定义

    execute dbms_redefinition.start_redef_table('edu','LOGIN_USER_DETAIL','LOGIN_USER_DETAIL_new',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个参数没用到,因为这里是由普通表转换为分区表

    start_redef_table执行时间为12.5s 数据量为80万。

    步骤三和步骤四中间步骤:

    select count(*)
    from edu.LOGIN_USER_DETAIL_new;

    /

    select count(*)
    from edu.LOGIN_USER_DETAIL;

    ----数据会有差别 而且与实际不符

    /

    并且对表进行DML操作

     delete edu.login_user_detail
     where id=355;

    步骤四、保证数据的一致性:

    execute dbms_redefinition.sync_interim_table ('edu','LOGIN_USER_DETAIL','LOGIN_USER_DETAIL_new');

    步骤五、开始重定义之后,完成重定义之前,需要在中间表上创建与源表对应的索引、外键、触发器等,而中间表与源表对应的主键,如果需要按照主键重定义,需要再开始redefine之前创建,如果按照rowid进行重定义,对应主键呢?

    CREATE INDEX EDU.IDX_WEBID_TICKET_CLIFO
        ON EDU.LOGIN_USER_DETAIL_new(WEB_ID,TICKET,CLIENT_INFO)
    TABLESPACE EDUCATION
    NOLOGGING
    PCTFREE 10
    INITRANS 2
    MAXTRANS 255
    STORAGE(BUFFER_POOL DEFAULT)
    NOPARALLEL
    NOCOMPRESS

    步骤六、完成重定义

    ----完成重定义
    execute dbms_redefinition.finish_redef_table('edu','LOGIN_USER_DETAIL','LOGIN_USER_DETAIL_new');

    desc LOGIN_USER_DETAIL
    /
    select table_name,index_name,index_type,status
    from user_indexes
    where table_name in ('LOGIN_USER_DETAIL', 'LOGIN_USER_DETAIL_new');

    ------看一下

    此时的'LOGIN_USER_DETAIL的索引为EDU.IDX_WEBID_TICKET_CLIFO

    而非原来EDU.IDX_WEBID_TICKET_CLINFO,

    LOGIN_USER_DETAIL_new的索引由EDU.IDX_WEBID_TICKET_CLINFO变成EDU.IDX_WEBID_TICKET_CLIFO

    表结构变成分区表的结构,而的LOGIN_USER_DETAIL_new的结构变成了redefine之前的的LOGIN_USER_DETAIL的普通表结构;

    对于触发器又会是什么效果呢?

    --------------------------------

    步骤七:

    DROP TABLE edu.LOGIN_USER_DETAIL_new

    结论:

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

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

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

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

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

    可以普通表转为分区表;

    分区表也可以重定义。

      

       

  • 相关阅读:
    前台隐藏或者看不见
    关于线程安全
    JAVA中的length属性和length()方法和size()方法的区别
    内存泄露和内存溢出
    配置tomcat,只需要启动一次
    ThickBox关闭本页,刷新父页
    Myeclipse断点问题
    解决windows远程(Telnet)最大连接数的问题
    父页刷新的方法
    Jsp页面大小写转换
  • 原文地址:https://www.cnblogs.com/gracejiang/p/5890473.html
Copyright © 2011-2022 走看看