使用線上重定義對錶進行分割槽 -- 基於rowid
阿新 • • 發佈:2018-12-13
RDBMS 11.2.0.4
之前對錶進行 線上重定義分割槽。主要使用的是primary key的方式。這次因為表上沒有primary key,所以通過rowid進行。以下為一個簡單的示例,該示例未涉及到索引等(其實索引也很簡單,設定到tmp表上帶過去就行了)
原始的表如下:
create table APPS.MQ_RECEIVE_LOG ( id NUMBER not null, msg_id VARCHAR2(100), calsign VARCHAR2(20), msg_os VARCHAR2(10), msg_type VARCHAR2(10), msg_receive_time DATE, remark VARCHAR2(500), msg_content CLOB ) tablespace USERS
1 檢查表是否可以進行線上重定義
exec dbms_redefinition.can_redef_table('APPS','MQ_RECEIVE_LOG',dbms_redefinition.cons_use_rowid);
2 建立中間表
create table APPS.MQ_RECEIVE_LOG_tmp ( id NUMBER not null, msg_id VARCHAR2(100), calsign VARCHAR2(20), msg_os VARCHAR2(10), msg_type VARCHAR2(10), msg_receive_time DATE, remark VARCHAR2(500), msg_content CLOB ) tablespace USERS partition by range(msg_receive_time) interval(NUMTODSINTERVAL(7,'day')) ( partition p20180925 values less than (to_date('2018-09-25','YYYY-MM-DD')) )
3 啟動線上重定義 。 -- 注意這裡面的null 引數。
exec dbms_redefinition.start_redef_table('APPS','MQ_RECEIVE_LOG','MQ_RECEIVE_LOG_tmp',null,dbms_redefinition.cons_use_rowid);
4 檢視中間表和原表的資料 -- 略
5 重新整理資料
exec dbms_redefinition.sync_interim_table('APPS','MQ_RECEIVE_LOG','MQ_RECEIVE_LOG_tmp');
6 檢查資料 --略
7 結束線上重定義
exec dbms_redefinition.finish_redef_table('APPS','MQ_RECEIVE_LOG','MQ_RECEIVE_LOG_tmp');
8 檢視分割槽
select table_name,partition_name from dba_tab_partitions where table_name='MQ_RECEIVE_LOG';
9 drop掉 中間表 -- 略
具體的dbms_redefinition的用法,可以參考官方的SQL Package文件。
備註:在12c中,做線上重定義沒有這麼多的步驟,一步搞定。具體可以參考之前的blog。
END