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

          1、創建表

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

          2、插入數據

          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
           
           出錯了, 該表上缺少主鍵,為該表建主鍵。再執行驗證。
           SQL
          > alter table t add constraint pk_t primary key(id);
           
          Table altered)

          4、建個和源表表結構一樣的分區表,作為中間表。按日期范圍分區

           

          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))是把所有剩下的數據分在一個區里,如果你想一個月建一個分區,那最好寫成這樣,提前建好,目前我還不知道能不能自動建,如果哪位知道請告知我,謝謝  
           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、執行表的在線重定義:

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

          6、執行把中間表的內容和數據源表進行同步。

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

          7、執行結束在線定義過程

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

          8、查看數據字典,可以看到改表已經成為了分區表。

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


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

          至此普通表轉為分區操作完成

          9、如果執行在線重定義的過程中出錯

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

           

          10、如果出現以下錯誤:

          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 即可繼續進行
          drop materialized view log on <tablename>;
          drop materialized view log on t;
              OR drop materialized t;

          詳細原理請查看:
          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 一凡 閱讀(6929) 評論(4)  編輯  收藏 所屬分類: DATABASE

          評論:
          # re: Oracle的在線重定義(將普通表轉為分區表ora9i以上版本) 2013-12-14 19:19 | hubery
          很好,贊一個!
          老大說了看到好文要評論,更好贊一個!  回復  更多評論
            
          # re: Oracle的在線重定義(將普通表轉為分區表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 行出現錯誤:
          ORA-12087: 在 "SYS" 擁有的表上不允許聯機重新定義
          ORA-06512: 在 "SYS.DBMS_REDEFINITION", line 137
          ORA-06512: 在 "SYS.DBMS_REDEFINITION", line 1478
          ORA-06512: 在 line 1
            回復  更多評論
            
          # re: Oracle的在線重定義(將普通表轉為分區表ora9i以上版本) 2013-12-15 21:58 | hubery
          我使用其他自己創建的用戶則報:
          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 行出現錯誤:
          ORA-06550: 第 1 行, 第 50 列:
          PLS-00201: 必須聲明標識符 'DBMS_REDEFINITION'
          ORA-06550: 第 1 行, 第 7 列:
          PL/SQL: Statement ignored  回復  更多評論
            
          # re: Oracle的在線重定義(將普通表轉為分區表ora9i以上版本) 2013-12-15 23:34 | hubery
          @hubery
          OK~!我明白了,查了下資料,原來是需要給用戶授予一個角色:
          SQL> grant EXECUTE_CATALOG_ROLE to hubery;

          授權成功。  回復  更多評論
            
          主站蜘蛛池模板: 涟水县| 乐东| 滁州市| 鄯善县| 巴林右旗| 克拉玛依市| 高陵县| 揭阳市| 东宁县| 浦城县| 嘉禾县| 昆明市| 称多县| 尖扎县| 辽中县| 芜湖县| 社旗县| 南城县| 淮阳县| 南平市| 新巴尔虎右旗| 阳江市| 洪泽县| 石柱| 荔浦县| 灵丘县| 林西县| 启东市| 芦山县| 龙游县| 卓尼县| 保靖县| 如东县| 新安县| 元朗区| 如皋市| 南乐县| 鹤山市| 博罗县| 汕尾市| 郸城县|