隨筆-204  評(píng)論-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);
           (如果沒(méi)有定義主鍵會(huì)提示以下錯(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è)問(wèn)題是:PARTITION P4 
          VALUES LESS THAN (MAXVALUE))是把所有剩下的數(shù)據(jù)分在一個(gè)區(qū)里,如果你想一個(gè)月建一個(gè)分區(qū),那最好寫成這樣,提前建好,目前我還不知道能不能自動(dòng)建,如果哪位知道請(qǐng)告知我,謝謝  
           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é)束在線定義過(guò)程

          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í)行在線重定義的過(guò)程中出錯(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ì)原理請(qǐng)查看:
          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 一凡 閱讀(6938) 評(píng)論(4)  編輯  收藏 所屬分類: DATABASE

          評(píng)論:
          # re: Oracle的在線重定義(將普通表轉(zhuǎn)為分區(qū)表ora9i以上版本) 2013-12-14 19:19 | hubery
          很好,贊一個(gè)!
          老大說(shuō)了看到好文要評(píng)論,更好贊一個(gè)!  回復(fù)  更多評(píng)論
            
          # re: Oracle的在線重定義(將普通表轉(zhuǎn)為分區(qū)表ora9i以上版本) 2013-12-15 21:41 | hubery
          弱弱的問(wèn)下,這個(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ù)  更多評(píng)論
            
          # 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)識(shí)符 'DBMS_REDEFINITION'
          ORA-06550: 第 1 行, 第 7 列:
          PL/SQL: Statement ignored  回復(fù)  更多評(píng)論
            
          # re: Oracle的在線重定義(將普通表轉(zhuǎn)為分區(qū)表ora9i以上版本) 2013-12-15 23:34 | hubery
          @hubery
          OK~!我明白了,查了下資料,原來(lái)是需要給用戶授予一個(gè)角色:
          SQL> grant EXECUTE_CATALOG_ROLE to hubery;

          授權(quán)成功。  回復(fù)  更多評(píng)論
            
          主站蜘蛛池模板: 隆回县| 尼木县| 宜黄县| 朝阳区| 文山县| 玉环县| 武陟县| 微博| 镇沅| 闸北区| 冷水江市| 台江县| 宜兰县| 黔西| 安康市| 乾安县| 佳木斯市| 开远市| 浦县| 荆州市| 麻城市| 瑞安市| 宁晋县| 江川县| 宜兴市| 拜城县| 临沂市| 通州市| 旺苍县| 鲁山县| 玉树县| 洪湖市| 长顺县| 长岭县| 水富县| 绥中县| 周宁县| 利津县| 色达县| 龙州县| 三穗县|