2019/10/08

20191008-程式-Oracle-處理Table Space相關議題 (Shrink Space)


(趁現在學習後記憶還新,將主軸重點記錄下來)

緣由背景

目前處理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


參考重點文:

(THE END)