背景介紹:有時候隨着業務的發展,需要將普通的錶轉換成分區表。這裏主要介紹在線自動轉換的方式。
一:源表和索引創建
源表創建
CREATE TABLE EDC_SEPERATOR
(
SEPERATOR_ID NUMBER(15) NOT NULL,
EQUIPMENTINFO NVARCHAR2(20),
RECORD NVARCHAR2(50),
TITLE NVARCHAR2(50),
ID NVARCHAR2(50),
TESTDATE NVARCHAR2(50),
TESTTIME VARCHAR2(50 BYTE),
COMT NVARCHAR2(50),
OPERATOR NVARCHAR2(50),
CLASSIFIC NVARCHAR2(50),
BIN NVARCHAR2(50),
UOC NVARCHAR2(50),
ISC NVARCHAR2(50),
RSERIEC NVARCHAR2(50),
RSH NVARCHAR2(50),
FF NVARCHAR2(50),
ETA NVARCHAR2(50),
IREV2 NVARCHAR2(50),
TCELL NVARCHAR2(50),
TMONICELL NVARCHAR2(50),
INSOL NVARCHAR2(50),
UMPP NVARCHAR2(50),
IMPP NVARCHAR2(50),
PMPP NVARCHAR2(50),
JSC NVARCHAR2(50),
ENTITY_RRN NUMBER(15),
SORTER_SEQ NUMBER(15),
IMPORTTIME DATE,
DBIMPORTTIME DATE
)
Table created.
源表建立索引
SQL> CREATE INDEX INDX_EDC_SEPERATOR ON EDC_SEPERATOR(IMPORTTIME);
Index created.
SQL> CREATE INDEX INDX3_EDC_SEPERATOR ON EDC_SEPERATOR(COMT);
Index created.
二:開始在線重定義源表
如果有主鍵,基於主鍵重定義
begin
dbms_redefinition.can_redef_table('TEST','EDC_SEPERATOR');
end;
沒有主鍵,基於row_id重定義(兩種寫法)
1:
begin
dbms_redefinition.can_redef_table('TEST','EDC_SEPERATOR',2);
end;
2:
begin
dbms_redefinition.can_redef_table('TEST','EDC_SEPERATOR',dbms_redefinition.cons_use_rowid);
end;
創建中間表
CREATE TABLE TMP_P
(
SEPERATOR_ID NUMBER(15) NOT NULL,
EQUIPMENTINFO NVARCHAR2(20),
RECORD NVARCHAR2(50),
TITLE NVARCHAR2(50),
ID NVARCHAR2(50),
TESTDATE NVARCHAR2(50),
TESTTIME VARCHAR2(50 BYTE),
COMT NVARCHAR2(50),
OPERATOR NVARCHAR2(50),
CLASSIFIC NVARCHAR2(50),
BIN NVARCHAR2(50),
UOC NVARCHAR2(50),
ISC NVARCHAR2(50),
RSERIEC NVARCHAR2(50),
RSH NVARCHAR2(50),
FF NVARCHAR2(50),
ETA NVARCHAR2(50),
IREV2 NVARCHAR2(50),
TCELL NVARCHAR2(50),
TMONICELL NVARCHAR2(50),
INSOL NVARCHAR2(50),
UMPP NVARCHAR2(50),
IMPP NVARCHAR2(50),
PMPP NVARCHAR2(50),
JSC NVARCHAR2(50),
ENTITY_RRN NUMBER(15),
SORTER_SEQ NUMBER(15),
IMPORTTIME DATE,
DBIMPORTTIME DATE
)
PARTITION BY RANGE (IMPORTTIME)
INTERVAL (NUMTOYMINTERVAL(1,'MONTH'))
(
PARTITION P1 VALUES LESS THAN (to_date('20160101','YYYYMMDD'))
) TABLESPACE TEST
在線重定義
SQL> execute dbms_redefinition.start_redef_table('TEST','EDC_SEPERATOR','TMP_P',null,2);
PL/SQL procedure successfully completed.
在線同步
execute dbms_redefinition.sync_interim_table('TEST','EDC_SEPERATOR','TMP_P');
中間表創建索引
SQL> CREATE INDEX INDX_P_SEPERATOR ON TMP_P(IMPORTTIME);
Index created.
SQL> CREATE INDEX INDX3_P_SEPERATOR ON TMP_P (COMT);
Index created.
完成重定義
SQL> execute dbms_redefinition.finish_redef_table('TEST','EDC_SEPERATOR','TMP_P');
PL/SQL procedure successfully completed.
刪除中間表
drop table tmp_p
檢查是否已經分區
SQL>select TABLE_NAME,PARTITIONED from DBA_tables WHERE TABLE_NAME='EDC_SEPERATOR';
TABLE_NAME PAR
------------------------------ ---
EDC_SEPERATOR YES