ZT 透過MOVE PARTITION來回收已經使用的空間
ORACLE 10G中,對於空間的回收利用已經有了很大的提高,這裡討論的只限於線上系統的空間回收,而對於應用可以停的回收方法,比如CTAS然後TRUNCATE原表,然後再把表RENAME回來這樣類似的方法不做討論。對於但表的回收技巧,比如MOVE、SHRINK等也不錯過多的描述,只需要提醒大家注意的是MOVE會鎖表,所以線上系統請謹慎使用,而且MOVE後,表上相關的索引會失效。雖然表的MOVE有ONLINE選項可以使用,但這個ONLINE只能用在IOT的表上,而普通表不能使用。另外使用SHRINK的時候,表的第一個EXTENT很重要,如果這個EXTENT在資料檔案中的位置很靠後,那SHRINK後,資料檔案還是沒有辦法進行縮小的,空間還是收不回來。(這些未經完全測試,使用前請注意測試)
這裡主要討論的是分割槽表中的分割槽移動來實現資料空間的回收。幾個表空間,因為當初資料量很大,所表幾個表空間都曾經膨脹了很大,但是經過歷史資料清理後(刪除一些表和分割槽),這些表空間很空閒,但是因為很多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相關的連結如下:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/82387/viewspace-1016597/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 通過MOVE PARTITION來回收已經使用的空間
- ORACLE MOVE表空間Oracle
- 透過壓縮Docker桌面WSL 2 VM回收大量磁碟空間 - NickDocker
- Oracle10g的回收站(recyclebin)和自由空間管理(zt)Oracle
- [轉移]ORACLE MOVE 表空間Oracle
- 查詢所有表空間的總容量、已經使用、剩餘、已經使用的百分比,增加容量!
- Oracle 表空間回收Oracle
- 使用exchange partition來交換不同schema之間的表
- alter table table_name move ; 在自身表空間move是如何操作的?
- Oracle move和shrink釋放高水位空間Oracle
- Mongodb中回收remove的磁碟空間MongoDBREM
- ORA-14257: cannot move partition other than a Range or Hash partition
- 透過rman備份system系統表空間
- 表、索引遷移表空間alter table move索引
- ORACLE ASM的SSD磁碟空間回收分析OracleASM
- 透過shell指令碼檢視資料庫表空間使用情況指令碼資料庫
- 認識 SYSAUX 表空間(zt)UX
- oracle10g的sysaux空間暴增與空間回收-轉載OracleUX
- ORACLE實驗(move表空間和database link)OracleDatabase
- undo表空間不能回收的解決方法
- 【實驗】【PARTITION】RANGE分割槽表移動表分割槽(Move Partition)
- Oracle undo表空間切換(ZT)Oracle
- 通過壓縮 Docker 桌面 WSL 2 VM 回收大量磁碟空間 - NickDocker
- 透過sql語句建立表時指定表空間的語法SQL
- oracle 回收表空間的資料檔案大小Oracle
- Delete大量資料後,回收表空間delete
- partition 分割槽表移動到其他表空間
- 透過使用Chrome的開發者工具來學習JavaScriptChromeJavaScript
- Oracle 釋放過度使用的Undo表空間Oracle
- dataguard standby備庫磁碟空間滿(ZT)
- dbca是透過哪個檔案發現已經存在的資料庫的?資料庫
- PG的物理儲存結構、版本控制、空間回收
- Oracle已經過時?Oracle
- MySQL 可以壓縮或回收磁碟空間嗎MySql
- test oracle array的使用,透過type來自定義arrayOracle
- 透過xtts遷移單例項檔案系統表空間到RAC ASM儲存表空間TTS單例ASM
- 【深入學習JVM 04】回收“已死”物件的過程JVM物件
- sysaux表空間檔案損壞的處理(zt)UX