普通錶轉換分割槽表-線上重定義

yewushang發表於2014-07-15

普通錶轉化分割槽表—線上重定義
以下為YWS表為示例:

Sys使用者授權
SQL> grant execute on DBMS_REDEFINITION to ;

1. 獲取原來表的後設資料。
可透過dbms_metadata.get_ddl獲取後設資料.

create table YWS.YWS --注原表需要有primary
(
  logid      NUMBER not null,
  typeid     NUMBER,
  levelid    NUMBER,
  userid     NUMBER,
  operate    VARCHAR2(100),
  title      VARCHAR2(100),
  descr      VARCHAR2(2000),
  createtime DATE
)

2.建立中間表
create table YWS.YWS_NEW
(
  logid      NUMBER not null,
  typeid     NUMBER,
  levelid    NUMBER,
  userid     NUMBER,
  operate    VARCHAR2(100),
  title      VARCHAR2(100),
  descr      VARCHAR2(2000),
  createtime DATE
)
PARTITION BY RANGE(create_date)  --按照時間進行的範圍分割槽
INTERVAL(NUMTOYMINTERVAL(1,'MONTH')) –-11g新特性 間隔分割槽
(
  PARTITION P1 VALUES LESS THAN(TO_DATE('2014-05-01','YYYY-MM-DD'))
);

NOTE:
可按照範圍分割槽:
PARTITION BY RANGE (customer_id)  -–注意欄位型別需要為number型別 才可利用間隔分割槽
INTERVAL (1000000)    -–1000000一個分割槽
(PARTITION p1 VALUES LESS THAN (1000001));

3.執行校驗
EXEC DBMS_REDEFINITION.CAN_REDEF_TABLE(user, 'YWS', DBMS_REDEFINITION.CONS_USE_PK);

4.執行線上重定義

EXEC DBMS_REDEFINITION.START_REDEF_TABLE(USER, ' YWS ', ' YWS_new');

5.結束線上重定義
EXEC DBMS_REDEFINITION.FINISH_REDEF_TABLE(USER, ' YWS ', ' YWS_new');

6. 檢查是否成功

select table_name,partitioning_type,partition_count

        From dba_part_tables where table_name='YWS';

select partition_name,high_value,tablespace_name

       from dba_tab_partitions where table_name='YWS'

       order by partition_position;

7.校驗完資料.清空中間表
truncate table yws_new;
drop table yws_new purge;
 8.注意的問題:
  無主鍵:
SQL> EXEC DBMS_REDEFINITION.CAN_REDEF_TABLE(user, 'YWS', DBMS_REDEFINITION.CONS_USE_PK);
 
begin DBMS_REDEFINITION.CAN_REDEF_TABLE(user, 'YWS', DBMS_REDEFINITION.CONS_USE_PK); end;
 
ORA-12089: 不能聯機重新定義無主鍵的表 "YWS"."YWS"
ORA-06512: 在 "SYS.DBMS_REDEFINITION", line 143
ORA-06512: 在 "SYS.DBMS_REDEFINITION", line 1635
ORA-06512: 在 line 2
 
SQL> EXEC DBMS_REDEFINITION.CAN_REDEF_TABLE(user, 'YWS', DBMS_REDEFINITION.CONS_USE_PK);
 
begin DBMS_REDEFINITION.CAN_REDEF_TABLE(user, 'YWS', DBMS_REDEFINITION.CONS_USE_PK); end;
 
ORA-12089: 不能聯機重新定義無主鍵的表 "YWS"."YWS"
ORA-06512: 在 "SYS.DBMS_REDEFINITION", line 143
ORA-06512: 在 "SYS.DBMS_REDEFINITION", line 1635
ORA-06512: 在 line 2

解決方案:新增主鍵

分割槽鍵有空值
exec DBMS_REDEFINITION.abort_redef_table(user, 'YWS', 'YWS_NEW')以放棄執行線上重定義。SQL> EXEC DBMS_REDEFINITION.FINISH_REDEF_TABLE(USER, 'YWS', 'YWS_NEW');
BEGIN DBMS_REDEFINITION.FINISH_REDEF_TABLE(USER, 'YWS', 'YWS_NEW'); END;

*
ERROR at line 1:
ORA-42004: redefinition not instantiated
ORA-06512: at "SYS.DBMS_REDEFINITION", line 82
ORA-06512: at "SYS.DBMS_REDEFINITION", line 1532
ORA-06512: at line 1


SQL> exec DBMS_REDEFINITION.abort_redef_table(user, 'YWS', 'YWS_NEW')SQL>

PL/SQL procedure successfully completed.

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

相關文章