線上重定義方式將普通表修改為分割槽表

myis55555發表於2021-01-12

線上重定義表具有以下功能

(1)修改表的儲存引數;

(2)可以將錶轉移到其他表空間;

(3)增加並行查詢選項;

(4)增加或刪除分割槽;

(5)重建表以減少碎片;

(6)將堆表改為索引組織表或相反的操作;

(7)增加或刪除一個列。

呼叫DBMS_REDEFINITION包需要EXECUTE_CATALOG_ROLE角色,除此之外,

還需要CREATE ANY TABLE、ALTER ANY TABLE、DROP ANY TABLE、LOCK ANY TABLE和SELECT ANY TABLE的許可權。

線上重定義表的步驟說明

1.選擇一種重定義方法:

存在兩種重定義方法,一種是基於主鍵、另一種是基於ROWID。

ROWID的方式不能用於索引組織表,而且重定義後會存在隱藏列M_ROW$$。預設採用主鍵的方式。

2.呼叫DBMS_REDEFINITION.CAN_REDEF_TABLE()過程,如果表不滿足重定義的條件,將會報錯並給出原因。

3.在用一個方案中建立一個空的中間表,根據重定義後你期望得到的結構建立中間表。

比如:採用分割槽表,增加了COLUMN等。

4.呼叫DBMS_REDEFINITION.START_REDEF_TABLE()過程,並提供下列引數:

被重定義的表的名稱、中間表的名稱、列的對映規則、重定義方法。

如果對映方法沒有提供,則認為所有包括在中間表中的列用於表的重定義。

如果給出了對映方法,則只考慮對映方法中給出的列。如果沒有給出重定義方法,則認為使用主鍵方式。

5.在中間表上建立觸發器、索引和約束,並進行相應的授權。任何包含中間表的完整性約束應將狀態置為disabled。

當重定義完成時,中間表上建立的觸發器、索引、約束和授權將替換重定義表上的觸發器、索引、約束和授權。

中間表上disabled的約束將在重定義表上enable。

6.(可選)如果在執行DBMS_REDEFINITION.START_REDEF_TABLE()過程

和執行DBMS_REDEFINITION.FINISH_REDEF_TABLE()過程直接在重定義表上執行了大量的DML操作,

那麼可以選擇執行一次或多次的SYNC_INTERIM_TABLE()過程,

以減少最後一步執行FINISH_REDEF_TABLE()過程時的鎖定時間。

7.執行DBMS_REDEFINITION.FINISH_REDEF_TABLE()過程完成表的重定義。

這個過程中,原始表會被獨佔模式鎖定一小段時間,具體時間和表的資料量有關。

執行完FINISH_REDEF_TABLE()過程後,原始表重定義後具有了中間表的屬性、索引、約束、授權和觸發器。

中間表上disabled的約束在原始表上處於enabled狀態。

8.(可選)可以重新命名索引、觸發器和約束。對於採用了ROWID方式重定義的表,包括了一個隱含列M_ROW$$。

推薦使用下列語句經隱含列置為UNUSED狀態或刪除。


-- MA_User

-- 1、檢查是否支援線上重定義

execute dbms_redefinition.can_redef_table('TEST','MA_User');


-- 2、建立分割槽表 表名_temp

create table MA_User_TEMP 
(
   UserNum               INTEGER              not null,
   UserName             VARCHAR2(30),
   CreateDate            DATE NOT NULL,
   Remark                  VARCHAR2(64)
)
partition by range
 (CreateDate)
interval
 (NUMTOYMINTERVAL(1,'MONTH'))
        store in (ET_Month_Part)
 (partition part_01
 values less than (TO_DATE('20170101','YYYYMMDD')))
 enable row movement;
alter table MA_User_TEMP 
   add constraint PK_MA_User_TEMP  primary key (UserNum);

-- 3、執行表的線上重定義

execute dbms_redefinition.start_redef_table('TEST','MA_User','MA_User_TEMP');

-- 4、執行中間表和資料來源表的資料同步。

execute dbms_redefinition.sync_interim_table('TEST','MA_User','MA_User_TEMP');

-- 5、執行結束線上定義過程。

execute dbms_redefinition.finish_redef_table('TEST','MA_User','MA_User_TEMP');

-- 6、驗證資料

select t1.partition_name from DBA_TAB_PARTITIONS t1 where t1.table_name = 'MA_USER';
select t1.partition_name from DBA_TAB_PARTITIONS t1 where t1.table_name = 'MA_USER_TEMP';

-- 7、刪除臨時表

drop table MA_User_TEMP purge;

-- 8、修改索引名

-- alter index IDX_PART_TABLE rename to IDX_T_TABLE;
alter index 
PK_MA_User_TEMP rename to PK_MA_User;
alter table MA_User rename constraint PK_MA_User_TEMP to PK_MA_User;



   


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

相關文章