<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-204  評論-90  文章-8  trackbacks-0

    1、創(chuàng)建表

    SQL> CREATE TABLE T (ID NUMBER PRIMARY KEY, TIME DATE);

    2、插入數(shù)據(jù)

    SQL> INSERT INTO T SELECT ROWNUM, CREATED FROM DBA_OBJECTS;
    SQL
    > COMMIT;

    3、在線重定義的表自行驗(yàn)證,看該表是否可以重定義,

    SQL> EXEC DBMS_REDEFINITION.CAN_REDEF_TABLE(user'T', DBMS_REDEFINITION.CONS_USE_PK);
     (如果沒有定義主鍵會提示以下錯(cuò)誤信息
     
    begin dbms_redefinition.can_redef_table(user,'pft_party_profit_detail'); end;
     ORA
    -12089: cannot online redefine table "OFSA"."PFT_PARTY_PROFIT_DETAIL" with no primary key
     ORA
    -06512: at "SYS.DBMS_REDEFINITION", line 8
     ORA
    -06512: at "SYS.DBMS_REDEFINITION", line 247
     ORA
    -06512: at line 1
     
     出錯(cuò)了, 該表上缺少主鍵,為該表建主鍵。再執(zhí)行驗(yàn)證。
     SQL
    > alter table t add constraint pk_t primary key(id);
     
    Table altered)

    4、建個(gè)和源表表結(jié)構(gòu)一樣的分區(qū)表,作為中間表。按日期范圍分區(qū)

     

    SQL> CREATE TABLE T_NEW (ID NUMBER PRIMARY KEY, TIME DATE) PARTITION BY RANGE (TIME) 
         (PARTITION P1 
    VALUES LESS THAN (TO_DATE('2004-7-1''YYYY-MM-DD')), 
         PARTITION P2 
    VALUES LESS THAN (TO_DATE('2005-1-1''YYYY-MM-DD')), 
         PARTITION P3 
    VALUES LESS THAN (TO_DATE('2005-7-1''YYYY-MM-DD')), 
         PARTITION P4 
    VALUES LESS THAN (MAXVALUE));
     這里值得注意的一個(gè)問題是:PARTITION P4 
    VALUES LESS THAN (MAXVALUE))是把所有剩下的數(shù)據(jù)分在一個(gè)區(qū)里,如果你想一個(gè)月建一個(gè)分區(qū),那最好寫成這樣,提前建好,目前我還不知道能不能自動建,如果哪位知道請告知我,謝謝  
     SQL
    > CREATE TABLE T_NEW (ID NUMBER PRIMARY KEY, TIME DATE) PARTITION BY RANGE (TIME) 
         (PARTITION P20070201 
    VALUES LESS THAN (TO_DATE('2007-2-1''YYYY-MM-DD')), 
         PARTITION P20070301 
    VALUES LESS THAN (TO_DATE('2005-3-1''YYYY-MM-DD')),
         PARTITION P20070401 
    VALUES LESS THAN (TO_DATE('2005-4-1''YYYY-MM-DD')), 
         PARTITION P20070501 
    VALUES LESS THAN (TO_DATE('2005-5-1''YYYY-MM-DD')),  
         PARTITION P20070601 
    VALUES LESS THAN (TO_DATE('2005-6-1''YYYY-MM-DD')));  

     

    5、執(zhí)行表的在線重定義:

    SQL> EXEC DBMS_REDEFINITION.START_REDEF_TABLE(USER'T''T_NEW');

    6、執(zhí)行把中間表的內(nèi)容和數(shù)據(jù)源表進(jìn)行同步。

    SQL>execute dbms_redefinition.sync_interim_table(user,'t','t_new');

    7、執(zhí)行結(jié)束在線定義過程

    SQL> EXEC DBMS_REDEFINITION.FINISH_REDEF_TABLE(user'T''T_NEW');

    8、查看數(shù)據(jù)字典,可以看到改表已經(jīng)成為了分區(qū)表。

    SQL> SELECT COUNT(*FROM T;
      
    COUNT(*)
    ----------
          6264
    SQL
    > SELECT COUNT(*FROM T PARTITION (P2);
      
    COUNT(*)
    ----------
          6246
    SQL
    > SELECT COUNT(*FROM T PARTITION (P3);


      
    COUNT(*)
    ----------

    至此普通表轉(zhuǎn)為分區(qū)操作完成

    9、如果執(zhí)行在線重定義的過程中出錯(cuò)

    可以在執(zhí)行dbms_redefinition.start_redef_table之后到執(zhí)行dbms_redefinition.finish_redef_table之前的時(shí)間里執(zhí)行:DBMS_REDEFINITION.abort_redef_table(user't''t_new')以放棄執(zhí)行在線重定義。

     

    10、如果出現(xiàn)以下錯(cuò)誤:

    SQL> exec dbms_redefinition.can_redef_table(user't');
    BEGIN dbms_redefinition.can_redef_table(user't'); END;

    *
    ERROR at line 
    1:
    ORA
    -12091: cannot online redefine table "user"."t" with
    materialized views
    ORA
    -06512: at "SYS.DBMS_REDEFINITION", line 137
    ORA
    -06512: at "SYS.DBMS_REDEFINITION", line 1478
    ORA
    -06512: at line 1

    用這句刪除materialized 
    view 即可繼續(xù)進(jìn)行
    drop materialized view log on <tablename>;
    drop materialized view log on t;
        OR drop materialized t;

    詳細(xì)原理請查看:
    Oracle的在線重定義表功能:http://tb.blog.csdn.net/TrackBack.aspx?PostId=900018
    Oracle的在線重定義表功能(二):http://blog.itpub.net/post/468/12962

    posted on 2007-04-19 17:11 一凡 閱讀(6922) 評論(4)  編輯  收藏 所屬分類: DATABASE

    評論:
    # re: Oracle的在線重定義(將普通表轉(zhuǎn)為分區(qū)表ora9i以上版本) 2013-12-14 19:19 | hubery
    很好,贊一個(gè)!
    老大說了看到好文要評論,更好贊一個(gè)!  回復(fù)  更多評論
      
    # re: Oracle的在線重定義(將普通表轉(zhuǎn)為分區(qū)表ora9i以上版本) 2013-12-15 21:41 | hubery
    弱弱的問下,這個(gè)例子是在什么用戶下操作的,我用sysdba用戶操作了報(bào)錯(cuò):
    SQL> exec dbms_redefinition.can_redef_table(user,'t',dbms_redefinition.cons_use_pk);
    BEGIN dbms_redefinition.can_redef_table(user,'t',dbms_redefinition.cons_use_pk); END;

    *
    第 1 行出現(xiàn)錯(cuò)誤:
    ORA-12087: 在 "SYS" 擁有的表上不允許聯(lián)機(jī)重新定義
    ORA-06512: 在 "SYS.DBMS_REDEFINITION", line 137
    ORA-06512: 在 "SYS.DBMS_REDEFINITION", line 1478
    ORA-06512: 在 line 1
      回復(fù)  更多評論
      
    # re: Oracle的在線重定義(將普通表轉(zhuǎn)為分區(qū)表ora9i以上版本) 2013-12-15 21:58 | hubery
    我使用其他自己創(chuàng)建的用戶則報(bào):
    SQL> exec dbms_redefinition.can_redef_table(user,'t',dbms_redefinition.cons_use_pk);
    BEGIN dbms_redefinition.can_redef_table(user,'t',dbms_redefinition.cons_use_pk); END;

    *
    第 1 行出現(xiàn)錯(cuò)誤:
    ORA-06550: 第 1 行, 第 50 列:
    PLS-00201: 必須聲明標(biāo)識符 'DBMS_REDEFINITION'
    ORA-06550: 第 1 行, 第 7 列:
    PL/SQL: Statement ignored  回復(fù)  更多評論
      
    # re: Oracle的在線重定義(將普通表轉(zhuǎn)為分區(qū)表ora9i以上版本) 2013-12-15 23:34 | hubery
    @hubery
    OK~!我明白了,查了下資料,原來是需要給用戶授予一個(gè)角色:
    SQL> grant EXECUTE_CATALOG_ROLE to hubery;

    授權(quán)成功。  回復(fù)  更多評論
      
    主站蜘蛛池模板: 波多野结衣免费一区视频| jizz免费在线影视观看网站| 亚洲另类无码一区二区三区| 亚洲av无码一区二区三区在线播放| 国产精品亚洲专区无码不卡| www在线观看播放免费视频日本| 中文字幕一区二区免费| 3d成人免费动漫在线观看| 在线观看免费人成视频色| 免费大香伊蕉在人线国产 | 亚洲视频一区网站| 亚洲精品第一综合99久久| 综合偷自拍亚洲乱中文字幕| 最近免费中文字幕中文高清 | 中文字幕人成人乱码亚洲电影 | 综合一区自拍亚洲综合图区| 中文字幕无码免费久久9一区9| 91av视频免费在线观看| 卡一卡二卡三在线入口免费| 亚洲无码视频在线| 91久久亚洲国产成人精品性色| 亚洲第一成年免费网站| 在线观看人成视频免费无遮挡| 无码少妇一区二区浪潮免费| 亚洲男人的天堂一区二区| 精品亚洲麻豆1区2区3区| 美女免费视频一区二区三区| 青青草原1769久久免费播放 | 污污网站免费观看| 手机看片久久国产免费| 亚洲AV无一区二区三区久久| 亚洲最大的成人网| 999zyz**站免费毛片| 成人性生免费视频| 亚洲国产精品无码久久一线| 亚洲日本一线产区和二线产区对比 | 亚洲国产日韩在线视频| 亚洲色精品三区二区一区| 毛片免费在线观看| 国产小视频在线免费| 亚洲国产超清无码专区|