1. 程式人生 > >使用線上重定義對錶進行分割槽 -- 基於rowid

使用線上重定義對錶進行分割槽 -- 基於rowid

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