通過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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- WSL 回收未使用的磁碟空間
- 通過壓縮 Docker 桌面 WSL 2 VM 回收大量磁碟空間 - NickDocker
- Oracle move和shrink釋放高水位空間Oracle
- UNDO表空間空間回收及切換
- ORACLE ASM的SSD磁碟空間回收分析OracleASM
- 透過壓縮Docker桌面WSL 2 VM回收大量磁碟空間 - NickDocker
- PG的物理儲存結構、版本控制、空間回收
- MySQL 可以壓縮或回收磁碟空間嗎MySql
- 環境互動:通過空間劃分的關卡設計
- 通過Eureka中已經註冊的服務名,呼叫服務
- win10 已經壓縮出的空間怎麼擴容到c盤Win10
- 【深入學習JVM 04】回收“已死”物件的過程JVM物件
- 當使用者無限制使用表空間配額且表空間有足夠空間時出現超出表空間的空間限額
- undo表空間使用率過高解決
- 歡迎來到devdede的空間!dev
- 通過sql 計算兩經緯度之間的距離SQL
- Oracle10g的回收站(recyclebin)和自由空間管理Oracle
- 【財富空間】未來已來,如何開啟人工智慧商業應用之旅人工智慧
- 臨時表空間使用率過高的解決辦法
- 檢查交換空間: 可用的交換空間為 0 MB, 所需的交換空間為 150 MB。 未通過
- 使用Laravel框架,怎麼通過訪問/xxxx/ooo.php也通過路由來使用Laravel框架PHP路由
- 樹莓派已經通過網路連線通過串列埠通訊在串列埠除錯小助手列印與操作樹莓派串列埠除錯
- 刪使用者刪表空間的操作還能flashback回來嗎?
- ChatGPT五天已經超過100萬使用者ChatGPT
- IPv4 地址耗盡,回收 E 類空間是否有意義?
- 3285.如何通過連結移動外部檔案到空間(步驟)
- 使用p名稱空間和c名稱空間的XML快捷方式XML
- 微服務之間通過RabbitMQ通訊微服務MQ
- 查詢過去一段時間內某條sql使用的臨時表空間大小SQL
- 特徵向量、神經元以及特徵空間特徵
- windows計劃任務的“等待空閒時間”已棄用Windows
- 通過IO模型帶來的思考模型
- 遊戲的型別創新是否已經停滯了,機制創新還有哪些突破空間?遊戲型別
- dotnet X11 棧空間被回收導致呼叫 XPutShmImage 閃退
- 埃森哲:中國企業正通過數字化釋放新的增長空間
- Wasm 原生時代已經來到ASM
- WPF所有原生空間使用demo
- NPD:25%的智慧機使用者換機時間已經達3年多