Oracle數據庫清理和回收system和sysaux表空間


1.先查詢下SYSTEM和SYSAUX表空間的使用率

--查詢下SYSTEM和SYSAUX表空間的使用率
SELECT * FROM ( 
    SELECT D.TABLESPACE_NAME, 
            SPACE || 'M' "SUM_SPACE(M)", 
            BLOCKS "SUM_BLOCKS", 
            SPACE - NVL (FREE_SPACE, 0) || 'M' "USED_SPACE(M)", 
            ROUND ( (1 - NVL (FREE_SPACE, 0) / SPACE) * 100, 2) || '%' 
               "USED_RATE(%)", 
            FREE_SPACE || 'M' "FREE_SPACE(M)" 
       FROM (  SELECT TABLESPACE_NAME, 
                     ROUND (SUM (BYTES) / (1024 * 1024), 2) SPACE, 
                     SUM (BLOCKS) BLOCKS 
                FROM DBA_DATA_FILES 
            GROUP BY TABLESPACE_NAME) D, 
           (  SELECT TABLESPACE_NAME, 
                     ROUND (SUM (BYTES) / (1024 * 1024), 2) FREE_SPACE 
                FROM DBA_FREE_SPACE 
            GROUP BY TABLESPACE_NAME) F 
     WHERE D.TABLESPACE_NAME = F.TABLESPACE_NAME(+) 
    UNION ALL                                                           
    SELECT D.TABLESPACE_NAME, 
           SPACE || 'M' "SUM_SPACE(M)", 
           BLOCKS SUM_BLOCKS, 
           USED_SPACE || 'M' "USED_SPACE(M)", 
           ROUND (NVL (USED_SPACE, 0) / SPACE * 100, 2) || '%' "USED_RATE(%)", 
           NVL (FREE_SPACE, 0) || 'M' "FREE_SPACE(M)" 
      FROM (  SELECT TABLESPACE_NAME, 
                     ROUND (SUM (BYTES) / (1024 * 1024), 2) SPACE, 
                     SUM (BLOCKS) BLOCKS 
                FROM DBA_TEMP_FILES 
            GROUP BY TABLESPACE_NAME) D, 
           (  SELECT TABLESPACE_NAME, 
                     ROUND (SUM (BYTES_USED) / (1024 * 1024), 2) USED_SPACE, 
                     ROUND (SUM (BYTES_FREE) / (1024 * 1024), 2) FREE_SPACE 
                FROM V$TEMP_SPACE_HEADER 
            GROUP BY TABLESPACE_NAME) F 
     WHERE D.TABLESPACE_NAME = F.TABLESPACE_NAME(+) 
    ORDER BY 1)  
    WHERE TABLESPACE_NAME IN ('SYSAUX','SYSTEM'); 
--end

2.查詢哪些表占用空間較大

--查詢哪些表占用空間較大
select * from (
    select segment_name,sum(bytes)/1024/1024 total_mb,tablespace_name from dba_segments where tablespace_name in
('SYSTEM','SYSAUX') group by segment_name,tablespace_name order by 2 desc)
    where rownum <=20;
--end

3.查看下SYSAUX表空間的使用情況

--查看下SYSAUX表空間的使用情況,可以通過v$sysaux_occupants視圖查詢到
SELECT occupant_name "Item",
           space_usage_kbytes / 1048576 "Space Used (GB)",
           schema_name "Schema",
           move_procedure "Move Procedure"
      FROM v$sysaux_occupants
    ORDER BY 2 desc;
--end

SELECT occupant_name "Item",
           space_usage_kbytes / 1048576 "Space Used (GB)",
           schema_name "Schema",
           move_procedure "Move Procedure"
      FROM v$sysaux_occupants
      where occupant_name='SM/AWR';
--end

 

4.通過查看v$sysaux_occupants視圖,可以確定占用SYSAUX表空間過多的大部分都是AWR的基表,這樣只要刪除部分AWR數據理論上就可以回收一部分SYSAUX表空間,
通常AWR的數據都會設置保留期限,10g版本默認保留7天,11g版本默認保留8天,可以通過dba_hist_wr_control視圖來查看(注:並不是所有DBA開頭的表都是數據字典,
也有很多是視圖,dba_hist_wr_control就是視圖)。

--查看AWR數據保留期限
select * from dba_hist_wr_control;

AWR的數據既然只保留七八天,為什么還會占用這么多的SYSAUX表空間呢?這個問題我個人認為主要有以下兩個原因,
首先,AWR刪除過期的數據是通過DELETE操作完成的,這樣就會產生大量的碎片,特別是SYSAUX表空間存在自動擴展的數據文件,
而且這個數據文件沒有擴展到最大,還有擴展的空間情況下會很明顯,其次就是ASH的數據有些情況下是不受AWR的保留策略影響的,
這個從下面的SQL就可以看出。

--查看HISTORY表的數據量
select count(*) from SYS.WRH$_ACTIVE_SESSION_HISTORY;

count(*)
-------------
13381288

--查看ASH快照id數量
select min(snap_id),max(snap_id) from sys.wrh$_active_session_history;

--查看下AWR統計數的保存天數
select dbms_stats.get_stats_history_retention from dual;

5.再次查看

--查看AWR占用SYSAUX表空間的大小
SELECT occupant_name "Item",
           space_usage_kbytes / 1048576 "Space Used (GB)",
           schema_name "Schema",
           move_procedure "Move Procedure"
      FROM v$sysaux_occupants
      where occupant_name='SM/AWR';
--end

6. 清空WRH$_ACTIVE_SESSION_HISTORY 表

--查看 WRH$_ACTIVE_SESSION_HISTORY 各個分區表大小
SELECT owner,
segment_name,
partition_name,
segment_type,
bytes /1024/1024 Size_M
FROM dba_segments
WHERE segment_name='WRH$_ACTIVE_SESSION_HISTORY'
order by 2;

--生成truncate語句
select distinct 'truncate table '||segment_name||';',s.bytes/1024/1024
from dba_segments s
where s.segment_name like 'WRH$%'
and segment_type in ('TABLE PARTITION', 'TABLE')
and s.bytes/1024/1024>100
order by s.bytes/1024/1024/1024 desc;

 

--直接truncate ,在sqlplus下執行
truncate table WRH$_ACTIVE_SESSION_HISTORY;

done

參考:
https://www.cnblogs.com/chxmtl/p/11981862.html
http://www.dbdream.com.cn/2017/01/oracle%e6%95%b0%e6%8d%ae%e5%ba%93%e6%b8%85%e7%90%86%e5%92%8c%e5%9b%9e%e6%94%b6system%e5%92%8csysaux%e8%a1%a8%e7%a9%ba%e9%97%b4/


----------------------------------------------------------------------
下面的操作是snap_id 從1開始時的終極辦法,上面的能搞定就行了
-

6. 通過MOVE操作回收這個表的水位線,來回收這部分被刪除數據占用的空間。這個表是分區表,分區表不支持表級別的MOVE操作,
直接對分區表進行MOVE操作會遇到ORA-14511錯誤。

alter table WRH$_ACTIVE_SESSION_HISTORY move;
ERROR at line 1:
ORA-14511: cannot perform operation on a partitioned object

--查看這個表的分區信息,有多個分區
select segment_name,partition_name,bytes/1024/1024/1024 gb from dba_segments where segment_name='WRH$_ACTIVE_SESSION_HISTORY';

1 WRH$_ACTIVE_SESSION_HISTORY WRH$_ACTIVE_827670780_58432 0.3671875
2 WRH$_ACTIVE_SESSION_HISTORY WRH$_ACTIVE_827670780_58456 0.3046875
3 WRH$_ACTIVE_SESSION_HISTORY WRH$_ACTIVE_827670780_58480 0.3359375
4 WRH$_ACTIVE_SESSION_HISTORY WRH$_ACTIVE_827670780_58504 0.34375
5 WRH$_ACTIVE_SESSION_HISTORY WRH$_ACTIVE_827670780_58528 0.390625
6 WRH$_ACTIVE_SESSION_HISTORY WRH$_ACTIVE_827670780_58552 0.375
7 WRH$_ACTIVE_SESSION_HISTORY WRH$_ACTIVE_827670780_58576 0.34375
8 WRH$_ACTIVE_SESSION_HISTORY WRH$_ACTIVE_827670780_58600 0.3203125
9 WRH$_ACTIVE_SESSION_HISTORY WRH$_ACTIVE_827670780_58624 0.1953125
10 WRH$_ACTIVE_SESSION_HISTORY WRH$_ACTIVE_SES_MXDB_MXSN 6.103515625E-5

7.下面按照分區進行MOVE操作,來回收空間
alter table WRH$_ACTIVE_SESSION_HISTORY move partition WRH$_ACTIVE_1357933872_0;
alter table WRH$_ACTIVE_SESSION_HISTORY move partition WRH$_ACTIVE_SES_MXDB_MXSN;


8.對分區表進行MOVE之后,需要重建索引,查看這個表的索引信息
select index_name from dba_indexes where table_name='WRH$_ACTIVE_SESSION_HISTORY';

----------------------------------------------------
INDEX_NAME
1 WRH$_ACTIVE_SESSION_HISTORY_PK
這個表只有一個主鍵,而且是分區索引,也不能對分區索引直接進行REBUILD操作,否則會遇到ORA-14086錯誤。
alter index WRH$_ACTIVE_SESSION_HISTORY_PK rebuild;
ERROR at line 1:
5
ORA-14086: a partitioned index may not be rebuilt as a whole


9.下面查看下這個索引的分區信息
select partition_name from dba_ind_partitions where index_name='WRH$_ACTIVE_SESSION_HISTORY_PK';

--------------------------------------------------
PARTITION_NAME
1 WRH$_ACTIVE_SES_MXDB_MXSN
2 WRH$_ACTIVE_827670780_58504
3 WRH$_ACTIVE_827670780_58576
4 WRH$_ACTIVE_827670780_58552
5 WRH$_ACTIVE_827670780_58528
6 WRH$_ACTIVE_827670780_58432
7 WRH$_ACTIVE_827670780_58600
8 WRH$_ACTIVE_827670780_58624
9 WRH$_ACTIVE_827670780_58480
10 WRH$_ACTIVE_827670780_58456


10.然后按照分區進行重建索引
alter index WRH$_ACTIVE_SESSION_HISTORY_PK rebuild partition WRH$_ACTIVE_1357933872_0;
alter index WRH$_ACTIVE_SESSION_HISTORY_PK rebuild partition WRH$_ACTIVE_SES_MXDB_MXSN;


11.再次查看,WRH$_ACTIVE_SESSION_HISTORY的空間已經回收
select sum(bytes)/1024/1024 from dba_segments where segment_name='WRH$_ACTIVE_SESSION_HISTORY';
select sum(bytes)/1024/1024 from dba_segments where segment_name='WRH$_ACTIVE_SESSION_HISTORY_PK';


附:
trancate 表空間不釋放的解決辦法
1.
--檢查T_IMP_TRUNCATE表的 INITIAL_EXTENT參數將近 100MB
SELECT T.TABLE_NAME, T.INITIAL_EXTENT/1024/1024 mb
FROM USER_TABLES T
WHERE T.TABLE_NAME = 'T_IMP_TRUNCATE'

2.決定對T_IMP_TRUNCATE表進行收縮shrink
--a.啟用行遷移
alter table T_IMP_TRUNCATE enable row movement;

--b.shrink表T_IMP_TRUNCATE
alter TABLE T_IMP_TRUNCATE shrink SPACE;

--c.關閉行遷移
alter table T_IMP_TRUNCATE DISABLE row movement;

3.shrink后T_IMP_TRUNCATE表空間已釋放
SELECT SUM(T.BYTES) / 1024 / 1024 MB
FROM USER_SEGMENTS T
WHERE T.SEGMENT_NAME = 'T_IMP_TRUNCATE';

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM