Oracle線上將普通錶轉分割槽表

abin1703發表於2016-09-14
使用ORACLE線上重定義將普通表改為分割槽表




1、檢查下這張表是否可以線上重定義,無報錯表示可以,報錯會給出錯誤資訊:


--管理員許可權執行begin
SQL>  exec dbms_redefinition.can_redef_table('gsinfo', 'T_UKEY_LOGIN');
PL/SQL procedure successfully completed


2、建立線上重定義需要的中間表,表結構就是要將原測試表重定義成什麼樣子,這裡建立的是按全宗號分割槽的分割槽表:
  CREATE TABLE T_UKEY_LOGIN_tmp
   (  ID VARCHAR2(50) NOT NULL ENABLE, 
  U_ID VARCHAR2(50), 
  IS_SUCCESS VARCHAR2(2), 
  LOGIN_TIME DATE, 
  LOCK_TIME DATE, 
   CONSTRAINT PK_T_UKEY_LOGIN_tmp PRIMARY KEY (ID))
 partition by range(LOGIN_TIME)(
 partition p1508 values less than (TO_DATE('2015-08-31 00:00:00','YYYY-MM-DD HH24:MI:SS')),
 partition p1509 values less than (TO_DATE('2015-09-30 00:00:00', 'YYYY-MM-DD HH24:MI:SS')),
 partition p1510 values less than (TO_DATE('2015-10-31 00:00:00', 'YYYY-MM-DD HH24:MI:SS')),
 partition p1511 values less than (TO_DATE('2015-11-30 00:00:00', 'YYYY-MM-DD HH24:MI:SS')),
 partition p1512 values less than (TO_DATE('2015-12-31 00:00:00', 'YYYY-MM-DD HH24:MI:SS')),
 partition p1601 values less than (TO_DATE('2016-01-31 00:00:00', 'YYYY-MM-DD HH24:MI:SS')),
 partition p1602 values less than (TO_DATE('2016-02-29 00:00:00', 'YYYY-MM-DD HH24:MI:SS')),
 partition p1603 values less than (TO_DATE('2016-03-31 00:00:00', 'YYYY-MM-DD HH24:MI:SS')),
 partition p1604 values less than (TO_DATE('2016-04-30 00:00:00', 'YYYY-MM-DD HH24:MI:SS')),          
 partition p1605 values less than (TO_DATE('2016-05-31 00:00:00', 'YYYY-MM-DD HH24:MI:SS')),
 partition p1606 values less than (TO_DATE('2016-06-30 00:00:00', 'YYYY-MM-DD HH24:MI:SS')),
 partition p1607 values less than (TO_DATE('2016-07-31 00:00:00', 'YYYY-MM-DD HH24:MI:SS')),
 partition p1608 values less than (TO_DATE('2016-08-31 00:00:00', 'YYYY-MM-DD HH24:MI:SS')),
 partition p1609 values less than (TO_DATE('2016-09-30 00:00:00', 'YYYY-MM-DD HH24:MI:SS')),
 partition p1610 values less than (TO_DATE('2016-10-31 00:00:00', 'YYYY-MM-DD HH24:MI:SS')),
 partition p1611 values less than (TO_DATE('2016-11-30 00:00:00', 'YYYY-MM-DD HH24:MI:SS')),
 partition p1612 values less than (TO_DATE('2016-12-31 00:00:00', 'YYYY-MM-DD HH24:MI:SS')),
 partition p1701 values less than (TO_DATE('2017-01-31 00:00:00', 'YYYY-MM-DD HH24:MI:SS')));
 
 3、.啟動線上重定義:


--管理員許可權執行sql命令列執行
exec dbms_redefinition.start_redef_table('gsinfo', 'T_UKEY_LOGIN', 'T_UKEY_LOGIN_tmp');
--管理員許可權執行sql命令列執行
這裡dbms_redefinition包的start_redef_table模組有3個引數,分別是SCHEMA名字、原表的名字、中間表的名字。






4、啟動線上重定義後,中間表就可以查到原表的資料。


select * from T_UKEY_LOGIN_tmp;




5、如果有往原表新插入的資料,使用dbms_redefinition包的sync_interim_table模組重新整理資料後,中間表也可以看到資料更改


--管理員許可權執行sql命令列執行,同步兩邊資料
exec dbms_redefinition.sync_interim_table('gsinfo', 'T_UKEY_LOGIN', 'T_UKEY_LOGIN_tmp');
--管理員許可權執行sql命令列執行


查詢同步後的兩邊資料是否一致:
select count(*) from T_UKEY_LOGIN;
select count(*)  from T_UKEY_LOGIN_tmp;


6、結束線上重定義


--管理員許可權執行sql命令列執行,結束重定義
exec dbms_redefinition.finish_redef_table('gsinfo', 'T_UKEY_LOGIN', 'T_UKEY_LOGIN_tmp');
--管理員許可權執行sql命令列執行


7、驗證資料


select * from T_UKEY_LOGIN;
select * from T_UKEY_LOGIN_tmp;


8、檢視各分割槽資料是否正確
select table_name, partition_name from user_tab_partitions where table_name = 'T_UKEY_LOGIN';


select * from T_UKEY_LOGIN partition(p1508);


9、線上重定義後,中間表已經沒有意義,刪掉中間表


drop table T_UKEY_LOGIN_tmp purge;

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30345407/viewspace-2124972/,如需轉載,請註明出處,否則將追究法律責任。

相關文章