溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

使用在線段收縮(ONLINE SEGMENT SHRINK)回收浪費的段空間

發(fā)布時間:2020-08-10 06:44:29 來源:ITPUB博客 閱讀:275 作者:18141908802 欄目:關系型數(shù)據(jù)庫

   ONLINE TABLE REDEFINITION(在線重定義表)(詳見:《使用DBMS_REDEFINITION包執(zhí)行在線重定義表(ONLINE TABLE REDEFINITION) 》:http://blog.itpub.net/23135684/viewspace-1765128/)也可以完成數(shù)據(jù)空間的回收,但是ONLINE SEGMENT SHRINK更合適單純的表空間回收,這篇文章將根據(jù)官方文檔的內(nèi)容討論通過在線段收縮回收浪費的空間。

一.回收未使用空間的原理

    隨著時間的推移,針對表空間下對象的UPDATE和DELETE操作會產(chǎn)生個別空的空間,這些空間不是足夠的大,沒辦法被新插入的數(shù)據(jù)使用。這種類型的空空間被認為是自由空間的碎片。

    擁有自由空間碎片的對象存在空間的浪費,也會影響數(shù)據(jù)庫的性能。首選的碎片整理和空間的回收方法是執(zhí)行在線段收縮(online segment shrink),這個過程會將高水位線以下的自由空間的碎片整合到一起,把段壓緊,壓緊之后,高水位線可以移動,最終的結果是新的自由空間在高水位線以上,高水位線以上的空間之后會回收(deallocated),在整個在線段回收的操作過程中段仍然可以被查詢和執(zhí)行DML操作,并且沒有額外的磁盤空間需要被分配。

    使用Segment Advisor標示段是在線段回收的優(yōu)勢,只有段屬于本地表空間管理和ASSM才是可行的。
如果段不符合在線段回收的要求,或者你想在回收空間的過程中改變表的邏輯或者物理屬性,可以使用在線表重定義的方式來實現(xiàn)段的空間回收。在線重定義被認為是重新對表的組織,和在線段回收不同,它要求分配額外的磁盤空間。

注意:SHRINK和DEALLOCATE兩個操作是有區(qū)別的,SHRINK是碎片整理,DEALLOCATE是降低高水位線,下面會對這兩個的區(qū)別進一步的說明。

二.Segment Advisor

   Segment Advisor用來鑒別Segment空間回收是否是可行的。它通過檢查使用情況,在AWR中的增長統(tǒng)計信息,以及段中的樣例數(shù)據(jù)來進行分析。Segment Advisor被配置成在維護窗口期間自動運行的維護任務,當然也可以手動運行它。Segment Advisor自動維護認為被叫做Automatic Segment Advisor。


Segment Advisor生成以下的建議:
1).Segment Advisor決定一個對象是否有重大的自由空間,推薦執(zhí)行在線段SHRINK。如果對象對應的表不符合回收條件,Segment Advisor推薦在線表重定義。
2).Segment Advisor決定表能從壓縮或者OLTP壓縮中獲得優(yōu)勢,推薦使用這種方法。
3).Segment Advisor遇到表row chain超過閥值,它記錄表大量chain row這種情況。

如果收到空間管理告警,或者你想回收空間,應該從Segment Advisor開始。

Automatic Segment Advisor不是分析數(shù)據(jù)庫的每一個對象,而是審查數(shù)據(jù)庫統(tǒng)計信息,段數(shù)據(jù)采樣,然后選擇一下的對象進行分析:
>表空間超過臨界點,或者空間閥值告警。
>最活躍的段。
>最高增長率的段。

Segment Advisor也手動的調(diào)用,可以通過OEM和DBMS_ADVISOR包進行調(diào)用。這里我們討論通過DBMS_ADVISOR進行調(diào)用的方法。

使用DBMS_ADVISOR包的存儲過程創(chuàng)建Segment Advisor工作,設置工作的屬性,然后執(zhí)行這個工作。使用此包必須有ADVISOR的權限。

下面通過一個例子來討論通過DBMS_ADVISOR手動調(diào)用Segment Advisor的方法,用戶執(zhí)行DBMS_ADVISOR包的存儲過程必須用此包的EXECUTE對象權限,或者ADVISOR系統(tǒng)權限。

注意:如果通過DBMS_ADVISOR.CREATE_OBJECT對表進行操作,如果表是一個分區(qū)表,Segment Advisor分析表的所有分區(qū),針對每個分區(qū)生成單獨的findings和推薦。

variable id number;
begin
  declare
  name varchar2(100);
  descr varchar2(500);
  obj_id number;
  begin
  name:='Manual_Employees';
  descr:='Segment Advisor Example';

  dbms_advisor.create_task (
    advisor_name     => 'Segment Advisor',
    task_id          => :id,
    task_name        => name,
    task_desc        => descr);

  dbms_advisor.create_object (
    task_name        => name,
    object_type      => 'TABLE',
    attr1            => 'HR',
    attr2            => 'EMPLOYEES',
    attr3            => NULL,
    attr4            => NULL,
    attr5            => NULL,
    object_id        => obj_id);

  dbms_advisor.set_task_parameter(
    task_name        => name,
    parameter        => 'recommend_all',
    value            => 'TRUE');

  dbms_advisor.execute_task(name);
  end;
end; 
/

查看Segment Advisor的結果
Segment Advisor創(chuàng)建了幾種類型的結果,recommendations,findings,actions和objects。


方法1:通過DBMS_SPACE.ASA_RECOMMENDATIONS查看結果。
這是一種最簡單的方法。

select tablespace_name, segment_name, segment_type, partition_name,
recommendations, c1 from
table(dbms_space.asa_recommendations('FALSE', 'FALSE', 'FALSE'));


TABLESPACE_NAME                SEGMENT_NAME                   SEGMENT_TYPE
------------------------------ ------------------------------ --------------
PARTITION_NAME
------------------------------
RECOMMENDATIONS
-----------------------------------------------------------------------------
C1
-----------------------------------------------------------------------------
TVMDS_ASSM                     ORDERS1                        TABLE PARTITION
ORDERS1_P2
Perform shrink, estimated savings is 57666422 bytes.
alter table "STEVE"."ORDERS1" modify partition "ORDERS1_P2" shrink space
 
TVMDS_ASSM                     ORDERS1                        TABLE PARTITION
ORDERS1_P1
Perform shrink, estimated savings is 45083514 bytes.
alter table "STEVE"."ORDERS1" modify partition "ORDERS1_P1" shrink space
 
TVMDS_ASSM_NEW                 ORDERS_NEW                     TABLE
 
Perform shrink, estimated savings is 155398992 bytes.
alter table "STEVE"."ORDERS_NEW" shrink space
 
TVMDS_ASSM_NEW                 ORDERS_NEW_INDEX               INDEX
 
Perform shrink, estimated savings is 102759445 bytes.
alter index "STEVE"."ORDERS_NEW_INDEX" shrink space


方法2:通過查詢DBA_ADVISOR_*視圖可以獲得結果。

在查詢DBA_ADVISOR_*視圖之前,可以通過查詢DBA_ADVISOR_TASKS.STATUS字段確保Segment Advisor工作已經(jīng)結束。

select task_name, status from dba_advisor_tasks
   where owner = 'STEVE' and advisor_name = 'Segment Advisor';
 
TASK_NAME                      STATUS
------------------------------ -----------
Manual Employees               COMPLETED

以下的例子說明如何查詢DBA_ADVISOR_*視圖從所有運行的Segment Advisor中檢索通過STEVE用戶提交的工作:
select af.task_name, ao.attr2 segname, ao.attr3 partition, ao.type, af.message 
  from dba_advisor_findings af, dba_advisor_objects ao
  where ao.task_id = af.task_id
  and ao.object_id = af.object_id
  and ao.owner = 'STEVE';
TASK_NAME          SEGNAME      PARTITION       TYPE             MESSAGE
------------------ ------------ --------------- ---------------- --------------------------
Manual_Employees   EMPLOYEES                    TABLE            The free space in the obje
                                                                 ct is less than 10MB.
 
Manual_Salestable4 SALESTABLE4  SALESTABLE4_P1  TABLE PARTITION  Perform shrink, estimated
                                                                 savings is 74444154 bytes.
 
Manual_Salestable4 SALESTABLE4  SALESTABLE4_P2  TABLE PARTITION  The free space in the obje
                                                                 ct is less than 10MB.


三.在線段空間SHRINK

   段SHRINK是在線的,內(nèi)部操作。在段SHRINK階段數(shù)據(jù)的移動不會影響DML操作和查詢操作。并行的DML操作在SHRINK操作結束,空間deallocated的時候會被短時間的阻塞。在SHRINK操作期間索引會被維護,操作完成后仍然是可用的。Segment SHRINK不要求額外的空間分配。


    Segment SHRINK高水位線以上和以下未使用的空間,相比較,空間deallocation只回收高水位線以上的空間。在回收操作中,默認情況下,數(shù)據(jù)庫壓緊段,調(diào)整高水位線,釋放浪費的空間。

    Segment Shrink要求行被移動到新的位置,因此必須在你想要shrink的獨享上首先啟用行遷移,和禁用在對象上基于rowid的觸發(fā)器定義。通過ALTER TABLE ... ENABLE ROW MOVEMENT語句啟用行遷移。

shrink只支持本地化表空間管理和ASMM管理的表空間下的表。

可以在表,IOT表,索引,分區(qū),子分區(qū),物化視圖,物化視圖日志上shrink空間。

如果表上有基于函數(shù)的索引,那么將無法對表進行shrink操作(CASCADE和NOCASCADE都不行)。


兩個shrink字句用于控制如何來shrink操作:

>COMPACT劃分SHRINK段操作到兩個階段,當你指定COMPACT,Oracle數(shù)據(jù)庫整理段空間碎片,壓緊表行,但是重新設置高水位線和deallocation空間會被延期。這個對長時間運行的查詢可能讀取被回收的塊來說是有用的。這個碎片整理和壓緊的結果會被保留到磁盤,之后可以再次以沒有COMPACT字句的命令執(zhí)行SHRINK SPACE語句。

>CASCADE字句延伸段shrink操作到所有依賴段的對象,例如,當SHRINK表段的時候指定CASCADE,表相關的所有索引將被SHRINK(不需要在SHRINK分區(qū)表的分區(qū)的時候指定CASCADE),可以運行DBMS_SPACE.OBJECT_DEPENDENT_SEGMENTS存儲過程來查看依賴段的所有對象。

如果不指定COMPAT字句,執(zhí)行段SHRINK之后的SQL語句都將因為失效的游標被重新的解析,因為這是個DDL操作。

例子:

>Shrink表和所有依賴它的段:(包括BASICFILE LOB段):
ALTER TABLE employees SHRINK SPACE CASCADE;

>只Shrink BASICFILE LOB段:
ALTER TABLE employees MODIFY LOB (perf_review) (SHRINK SPACE);

>Shrink分區(qū)表的單一分區(qū):
ALTER TABLE customers MODIFY PARTITION cust_P1 SHRINK SPACE;

>Shrink IOT索引段和overflow段:
ALTER TABLE cities SHRINK SPACE CASCADE;

>只SHRINK IOT overflow段:
ALTER TABLE cities OVERFLOW SHRINK SPACE;

四.Deallocate未使用的空間

   當執(zhí)行deallocate未使用的空間,數(shù)據(jù)庫使得數(shù)據(jù)庫段結尾之后未使用的空間變得可用(降低高水位線),注意,在對表做SHRINK之后高水位線默認會被降低,DEALLOCATE用于未執(zhí)行SHRINK或者,非默認的SHRINK時使用。


執(zhí)行deallocation之前,可以運行DBMS_SPACE.UNUSED_SPACE過程將返回高水位線位置信息,和段空間未使用空間的總數(shù)。對于本地化和段自動化管理的表空間,SPACE_USAGE可以獲得更準確的數(shù)據(jù)。

以下的語句deallocate段未使用的空間(表,索引或者cluster):
ALTER TABLE table DEALLOCATE UNUSED KEEP <integer>;
ALTER INDEX index DEALLOCATE UNUSED KEEP <integer>;
ALTER CLUSTER cluster DEALLOCATE UNUSED KEEP <integer>;

KEEP是可選的字句,指定段保留的空間總數(shù),可以通過檢查DBA_FREE_SPACE視圖驗證DEALLOCATED為自由的空間。

相關文章:
   《Moving表到新的段或者表空間http://blog.itpub.net/23135684/viewspace-1766480/

--end--

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

AI