通過MOVE PARTITION來回收已經使用的空間

zhang41082發表於2019-06-04

ORACLE 10G中,對於空間的回收利用已經有了很大的提高,這裡討論的只限於線上系統的空間回收,而對於應用可以停的回收方法,比如CTAS然後TRUNCATE原表,然後再把表RENAME回來這樣類似的方法不做討論。對於但表的回收技巧,比如MOVE、SHRINK等也不錯過多的描述,只需要提醒大家注意的是MOVE會鎖表,所以線上系統請謹慎使用,而且MOVE後,表上相關的索引會失效。雖然表的MOVE有ONLINE選項可以使用,但這個ONLINE只能用在IOT的表上,而普通表不能使用。另外使用SHRINK的時候,表的第一個EXTENT很重要,如果這個EXTENT在資料檔案中的位置很靠後,那SHRINK後,資料檔案還是沒有辦法進行縮小的,空間還是收不回來。(這些未經完全測試,使用前請注意測試)

[@more@]

這裡主要討論的是分割槽表中的分割槽移動來實現資料空間的回收。幾個表空間,因為當初資料量很大,所表幾個表空間都曾經膨脹了很大,但是經過歷史資料清理後(刪除一些表和分割槽),這些表空間很空閒,但是因為很多EXTENT的BLOCKID很靠後,所以空間收不回來,而且這些表空間中的資料表都是分割槽表,而且都是已經過期,目前基本不會用到的分割槽表,只會有查詢統計發生在這些表上,那麼,就可以使用把某些表空間中的表分割槽移動到其他表空間,從而把這個表空間騰空,另一個表空間充滿,最後回收空的表空間來達到縮小整體空間使用的目的。

MOVE分割槽表可能會導致全域性索引或者分割槽索引失效,那麼會影響到線上事務的進行,不過ORACLE提供了UPDATE INDEXES的關鍵字來使得MOVE PARTITION的時候,相關的索引也進行相應的更新,從而避免對線上事務的影響。下面來看看這些語法:

簡單的把一個分割槽移動到另一個表空間,同時UPDATE INDEXES關鍵字指定了更新表上所有的索引(包括GLOBAL和LOCAL)
alter table tab move partition p_tab tablespace tbl update indexes;

如果只更新GLOBAL索引:
alter table tab move partition p_tab tablespace tbl update global indexes;

如果更新索引的同時改變索引的存放位置:
alter table tab move partition p_tab tablespace tbl update indexes (idx_tab (partition p_idx_tab tablespace tbl));

如果更新的分割槽中包含LOB欄位,則LOB欄位可以單獨的MOVE,或者隨分割槽表一起MOVE:
alter table tab move partition p_tab tablespace tbl lob (tab.lob_colname) store as lobname (tablespace tbl);

只移動LOB的存放位置:
alter table tab move partition p_tab lob (tab.lob_colname) store as lobname (tablespace tbl);
其中如果LOBNAME不指定,則使用原先的LOBNAME(也就是LOB SEGMENT的PARTITION NAME);如果不帶LOB的屬性,只進行分割槽的移動,則LOB不會跟隨表分割槽進行移動。


並且,可以只移動一個子分割槽而不是整個分割槽,只需要把上面的PARTITION關鍵字換成SUBPARTITION即可。指定表空間位置只是這裡用到的一個MOVE相關的屬性,其實表和索引相關的儲存屬性,比如PCT值、初始事務數的值、是否壓縮等等都是可以在MOVE中實現的。需要注意的就是MOVE的時候加上UPDATE INDEXES關鍵字雖然不會使得索引失效,但是移動資料量很大的時候會產生很多日誌,而且比較耗費資源,最重要的是會在整個分割槽上加一個獨佔鎖,從而導致這個分割槽上出了SELECT外的其他DML都被阻塞,因此如果要避免MOVE當前使用的分割槽。

最後,MOVE分割槽表會有兩個相關的BUG,一個是HASH分割槽包含LOB的欄位進行LOB分割槽MOVE的時候會報一個ORA-22877錯(BUG:4583442 );另一個是MOVE分割槽後,可能會導致資料字典表IND$中的LOB索引不會被更新,從而使得之後刪除這個表空間的時候報一個ORA-22864的錯(BUG:4748597 )。這兩個BUG相關的連結如下:

https://metalink2.oracle.com/metalink/plsql/f?p=130:14:4216255153156932628::::p14_database_id,p14_docid,p14_show_header,p14_show_help,p14_black_frame,p14_font:NOT,4583442.8,1,1,1,helvetica

https://metalink.oracle.com/metalink/plsql/f?p=130:14:4216255153156932628::::p14_database_id,p14_docid,p14_show_header,p14_show_help,p14_black_frame,p14_font:NOT,4748597.8,1,0,1,helvetica

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

相關文章