oracle中將普通表變更為分割槽表
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-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))是把所有剩下的資料分在一個區裡,如果你想一個月建一個分割槽,那最好寫成這樣,提前建好,目前我還不知道能不能自動建,如果哪位知道請告知我,謝謝
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;