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';