Oracle 12C 新特性之表分割槽或子分割槽的線上遷移

張衝andy發表於2017-05-13
Oracle 12c 中遷移表分割槽或子分割槽到不同的表空間不再需要複雜的過程。與之前版本中未分割槽表進行線上遷移類似,表分割槽或子分割槽可以線上或是離線遷移至一個不同的表空間。當指定了 ONLINE 語句,所有的 DML 操作可以在沒有任何中斷的情況下,在參與這一過程的分割槽或子分割槽上執行。與此相反,分割槽或子分割槽遷移如果是在離線情況下進行的,DML 操作是不被允許的。

-- 建立實驗表
CREATE TABLE p_andy
(ID number(10), NAME varchar2(40))
PARTITION BY RANGE (id)
(PARTITION p1 VALUES LESS THAN (10),
PARTITION p2 VALUES LESS THAN (20),
PARTITION p3 VALUES LESS THAN (30),
PARTITION p4 VALUES LESS THAN (40)
);
Table created.

-- 插入資料
SQL> 
begin
for i in 1 .. 39 loop
insert into p_andy values(i,'andyi');
end loop ;
commit;
end;
/
PL/SQL procedure successfully completed.

-- 建立一個全域性非分割槽索引
SQL> create index idx_pandy_id on p_andy(id);
Index created.
-- 檢視索引狀態
SQL>
col index_name for a25 
select table_name,index_name,status,blevel,leaf_blocks,orphaned_entries from user_Indexes where index_name ='IDX_PANDY_ID';
TABLE_NAME                INDEX_NAME                STATUS       BLEVEL LEAF_BLOCKS ORP
------------------------- ------------------------- -------- ---------- ----------- ---
P_ANDY                    IDX_PANDY_ID              VALID             0           1 NO
-- 檢視錶分割槽狀態與分割槽所在的表空間
SQL> select table_name,partition_name,PARTITION_POSITION,tablespace_name,HIGH_VALUE from user_tab_partitions where table_name='P_ANDY';
TABLE_NAME                PARTITION_NAME            PARTITION_POSITION TABLESPACE_NAME                HIGH_VALUE
------------------------- ------------------------- ------------------ ------------------------------ ------------
P_ANDY                    P1                                         1 USERS                          10
P_ANDY                    P2                                         2 USERS                          20
P_ANDY                    P3                                         3 USERS                          30
P_ANDY                    P4                                         4 USERS                          40
-- 遷移表分割槽p1表空間 ,並帶 UPDATE INDEXES ONLINE 引數。
SQL> ALTER TABLE p_andy move PARTITION p1 TABLESPACE bbb UPDATE INDEXES ONLINE;
Table altered.
說明:引數 UPDATE INDEXES ONLINE 遷移表分割槽或子分割槽時維護表上任何本地或全域性的索引。此外,當使用ONLINE 語句時,DML 操作是不會中斷的。引入加鎖機制來完成這一過程,當然它也會導致效能下降並會產生大量的 redo,這取決於分割槽和子分割槽的大小。
-- 檢視錶分割槽狀態與分割槽所在的表空間
SQL> select table_name,partition_name,PARTITION_POSITION,tablespace_name,HIGH_VALUE from user_tab_partitions where table_name='P_ANDY';
TABLE_NAME                PARTITION_NAME            PARTITION_POSITION TABLESPACE_NAME                HIGH_VALUE
------------------------- ------------------------- ------------------ ------------------------------ 
P_ANDY                    P1                                         1 BBB                            10
P_ANDY                    P2                                         2 USERS                          20
P_ANDY                    P3                                         3 USERS                          30
P_ANDY                    P_MERGE                                    4 USERS                          40
-- 檢視索引狀態
SQL> select table_name,index_name,status,blevel,leaf_blocks,orphaned_entries from user_Indexes where index_name ='IDX_PANDY_ID';
TABLE_NAME                INDEX_NAME                STATUS       BLEVEL LEAF_BLOCKS ORP
------------------------- ------------------------- -------- ---------- ----------- ---
P_ANDY                    IDX_PANDY_ID              VALID             0           1 YES
-- 遷移表分割槽p2表空間 ,不帶 UPDATE INDEXES ONLINE 引數。
SQL> ALTER TABLE p_andy move PARTITION p2 TABLESPACE bbb ;
Table altered.
-- 檢視索引狀態
SQL> select table_name,index_name,status,blevel,leaf_blocks,orphaned_entries from user_Indexes where index_name ='IDX_PANDY_ID';
TABLE_NAME                INDEX_NAME                STATUS       BLEVEL LEAF_BLOCKS ORP
------------------------- ------------------------- -------- ---------- ----------- ---
P_ANDY                    IDX_PANDY_ID              UNUSABLE          0           1 NO
說明:不帶 UPDATE INDEXES ONLINE 引數,索引會失效,需要手工 rebulid 。
-- 重建索引
SQL> ALTER INDEX IDX_PANDY_ID REBUILD  PARALLEL (DEGREE 2);
Index altered.
-- 檢視索引狀態
SQL> select table_name,index_name,status,blevel,leaf_blocks,orphaned_entries from user_Indexes where index_name ='IDX_PANDY_ID';
TABLE_NAME                INDEX_NAME                STATUS       BLEVEL LEAF_BLOCKS ORP
------------------------- ------------------------- -------- ---------- ----------- ---
P_ANDY                    IDX_PANDY_ID              VALID             0           1 NO


補充:如果分割槽或分割槽索引比較大,可以使用並行move或rebuild,PARALLEL (DEGREE 2)  如:
ALTER TABLE table_name move SUBPARTITION sub_name TABLESPACE tts_name PARALLEL (DEGREE 2);
ALTER INDEX idx_name REBUILD TABLESPACE tts_name PARALLEL (DEGREE 2);
ALTER INDEX local_name REBUILD SUBPARTITION sub_name TABLESPACE tts_name PARALLEL (DEGREE 2);


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

相關文章