通過MOVE PARTITION來回收已經使用的空間
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相關的連結如下:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25016/viewspace-1016566/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- ZT 透過MOVE PARTITION來回收已經使用的空間
- ORACLE MOVE表空間Oracle
- WSL 回收未使用的磁碟空間
- 通過壓縮 Docker 桌面 WSL 2 VM 回收大量磁碟空間 - NickDocker
- [轉移]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
- Oracle 11gR2 注意revoke dba 會一併回收通過”quota“分配的表空間限額Oracle
- 表、索引遷移表空間alter table move索引
- ORACLE ASM的SSD磁碟空間回收分析OracleASM
- 通過 dbms_space.space_usage 檢視objects 的空間使用情況Object
- oracle10g的sysaux空間暴增與空間回收-轉載OracleUX
- ORACLE實驗(move表空間和database link)OracleDatabase
- undo表空間不能回收的解決方法
- 【實驗】【PARTITION】RANGE分割槽表移動表分割槽(Move Partition)
- 通過flashback database恢復被刪除的表空間Database
- 通過RENAME解救空間緊缺的DG系統 薦
- 透過壓縮Docker桌面WSL 2 VM回收大量磁碟空間 - NickDocker
- 通過shell指令碼檢視資料庫表空間使用情況指令碼資料庫
- oracle 回收表空間的資料檔案大小Oracle
- Delete大量資料後,回收表空間delete
- partition 分割槽表移動到其他表空間
- Oracle 釋放過度使用的Undo表空間Oracle
- liunx使用者空間和核心空間之間的通訊實現(在PPC下的實現)(轉)
- PG的物理儲存結構、版本控制、空間回收
- Oracle已經過時?Oracle
- MySQL 可以壓縮或回收磁碟空間嗎MySql
- 【深入學習JVM 04】回收“已死”物件的過程JVM物件
- 開通ITPUB個人空間
- javascript通過名稱空間放置全域性變數重名JavaScript變數
- win10 已經壓縮出的空間怎麼擴容到c盤Win10
- 通過配置檔案來修改WAS控制檯Session過期時間的方法Session
- 查詢表空間已使用空間和空閒空間的簡單檢視