(趁現在學習後記憶還新,將主軸重點記錄下來)
緣由背景
目前處理Oracle 的資料庫,發生了:ORA-01658: unable to create INITIAL extent for segment in tablespace XXXX 事件。
開始去認識:Oracle 下的 Table Space / 對應的File / Shrink Space概念 (刪除資料後,空間並不會自動釋放出來,而是要再”重組”後才會)
學習後的重點資訊
1. Oracle 資料庫的 資料存放位置概念:
a. 它不像SQL一樣,就是一個檔案mdf。而是 Table 會有 Partition的概念 (Table Segment ),分成超多份檔案儲存;
而建立Table partition 時,指定其「Table Space」,
而「Table Space」可由很多實體檔案聯集組成 ( xxx.dbf)
而「Table Space」可以設定 自動擴增(xxx.dbf)(每xxGB) 或是手動處理;這些都會「預占」硬碟空間的;
而「Table Space」所「預占」出來的空間,會有很多個Blocks(Block_ID),每個Block下有很多Data Block 資料段。
b. 當「資料刪除」時,該資料所占用的Blocks區段,並不會自動釋放出來。
所以要透過 Shrink Space(縮小空間) 處理來重排釋放出空間 (如同電腦下的硬碟重組 )
2. 要做的事情動作流程:
a. 要知道目前Oracle 下有那些的Table Space及其對應的實體Files及使用狀況: https://bit.ly/2MlldTj
b. 查出有問題的Table Space,要知道目前有那些 Table 使用,並查出那Table 占用最多: https://bit.ly/2OxhIvF
c. 針對目標Table 刪除資料 。(此篇文就完整說明整個流程及block資料check:https://bit.ly/30Z0zNT )
1) 刪除資料後,要執行 PL\SQL 程序,它才會重計算Row Count
SQL> execute dbms_stats.gather_table_stats('XXXUser','XXXXXXTable');
2) 開始執行 「Shrink space Or Shrink space compact 」的動作。
3) 要先啟用 Table Row movement 。
4) 執行 Shrink Space : SQL> alter table XXXUser.XXXTable shrink space;
執行完,一樣要再執行 PL\SQL 程序 (資料量大則很費時)
5) 執行完後,再查詢其 Block 資訊清單,則可看到其數字會下降
6) 再 關閉 Table Row movement
參考重點文:
- Oracle-縮小區段(Shrink Space) @ 香蕉皮 :: 痞客邦 :: (https://bit.ly/30Z0zNT)
- 阿Q先生努力中~~: [ORACLE]shrink原理與注意事項( https://bit.ly/2ASeFpV)
- [Oracle]高水位标记(HWM) - gegeman - 博客园 https://bit.ly/35iD6dV
(THE END)