<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、在線重定義的表自行驗證,看該表是否可以重定義,

    SQL> EXEC DBMS_REDEFINITION.CAN_REDEF_TABLE(user'T', DBMS_REDEFINITION.CONS_USE_PK);
     (如果沒有定義主鍵會提示以下錯誤信息
     
    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
     
     出錯了, 該表上缺少主鍵,為該表建主鍵。再執(zhí)行驗證。
     SQL
    > alter table t add constraint pk_t primary key(id);
     
    Table altered)

    4、建個和源表表結(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));
     這里值得注意的一個問題是:PARTITION P4 
    VALUES LESS THAN (MAXVALUE))是把所有剩下的數(shù)據(jù)分在一個區(qū)里,如果你想一個月建一個分區(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ù)源表進行同步。

    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í)行在線重定義的過程中出錯

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

     

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

    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ù)進行
    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
    很好,贊一個!
    老大說了看到好文要評論,更好贊一個!  回復(fù)  更多評論
      
    # re: Oracle的在線重定義(將普通表轉(zhuǎn)為分區(qū)表ora9i以上版本) 2013-12-15 21:41 | hubery
    弱弱的問下,這個例子是在什么用戶下操作的,我用sysdba用戶操作了報錯:
    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)錯誤:
    ORA-12087: 在 "SYS" 擁有的表上不允許聯(lián)機重新定義
    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)建的用戶則報:
    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)錯誤:
    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~!我明白了,查了下資料,原來是需要給用戶授予一個角色:
    SQL> grant EXECUTE_CATALOG_ROLE to hubery;

    授權(quán)成功。  回復(fù)  更多評論
      
    主站蜘蛛池模板: 亚洲国产熟亚洲女视频| 无码少妇一区二区浪潮免费| 中文字幕乱码亚洲精品一区 | 亚洲s色大片在线观看| 国产一精品一aⅴ一免费| 最近免费中文字幕大全免费| 爱情岛论坛免费视频| 亚洲日韩看片无码电影| 亚洲第一永久在线观看| 亚洲∧v久久久无码精品| 国外亚洲成AV人片在线观看| 国产精品免费视频一区| 成人黄软件网18免费下载成人黄18免费视频 | 亚洲一区二区三区免费| 成人免费无码大片A毛片抽搐| 亚洲视频在线免费观看| 两个人的视频www免费| 黄色免费在线观看网址| 亚洲sm另类一区二区三区| 亚洲国产熟亚洲女视频| 亚洲人色大成年网站在线观看| 久久精品国产亚洲夜色AV网站| 大胆亚洲人体视频| 在线观看国产情趣免费视频| 性感美女视频在线观看免费精品 | 亚洲一级二级三级不卡| 亚洲国产综合专区电影在线| 亚洲人JIZZ日本人| 国产亚洲精品久久久久秋霞| 国产亚洲精品看片在线观看| 亚洲国产一成久久精品国产成人综合| 日韩免费毛片视频| 国产精品国产免费无码专区不卡| 大学生美女毛片免费视频| 成全高清视频免费观看| 日日夜夜精品免费视频| 免费理论片51人人看电影| 日本一区二区三区日本免费| 青青青国产色视频在线观看国产亚洲欧洲国产综合 | jizzjizz亚洲日本少妇| 久久精品国产亚洲av瑜伽|