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

    可以在執(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ù)進(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 一凡 閱讀(6924) 評論(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)機(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)建的用戶則報:
    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ù)  更多評論
      
    主站蜘蛛池模板: 国产AV无码专区亚洲AV手机麻豆| 午夜精品一区二区三区免费视频 | 日本免费人成在线网站| 精品一卡2卡三卡4卡免费视频| aaa毛片免费观看| 99re6在线精品免费观看| 97在线免费视频| 久久成人免费电影| 中文字幕视频免费| 67194熟妇在线永久免费观看 | 亚洲免费人成在线视频观看 | 日韩在线观看免费完整版视频| 精品女同一区二区三区免费播放 | 精品特级一级毛片免费观看| 免费播放国产性色生活片| 一边摸一边桶一边脱免费视频| jizz免费在线影视观看网站| 插鸡网站在线播放免费观看| 免费人成毛片动漫在线播放 | 久久久久国色AV免费观看| 久久午夜无码免费| 99国产精品永久免费视频 | 免费毛片在线看不用播放器| 色欲色香天天天综合网站免费| 在线观看的免费网站无遮挡| 无码日韩精品一区二区免费| 国产成人一区二区三区免费视频| 免费少妇a级毛片人成网| 亚洲午夜久久久久妓女影院| 亚洲图片在线观看| 亚洲乱码无人区卡1卡2卡3| 特级aa**毛片免费观看| 中文字幕免费在线播放| 最刺激黄a大片免费网站| 成年大片免费视频| 久久久久亚洲AV无码专区桃色| 亚洲AV日韩AV永久无码久久| 亚洲午夜一区二区三区| 免费又黄又爽又猛大片午夜 | 亚洲日本成本人观看| 一级毛片人与动免费观看|