做者 | JiekeXu
html
來源 | JiekeXu之路(ID: JiekeXu_IT)
linux
轉載請聯繫受權 | (微信ID:xxq1426321293)web
你們好,我是 JiekeXu,很高興又和你們見面了,今天分享下SYSAUX 和 SYSTEM 表空間回收的相關知識點 。 本文發佈於微信公衆號【JiekeXu之路】,歡迎點擊上方藍字關注我,標星或置頂,更多幹貨第一時間到達!
01--表空間使用率現狀sql
經過查詢可得知目前表空間使用狀況以下圖:可看到 SYSAUX 表空間和 SYSTEM 表空間使用率都已經高達99%,SYSAUX 表空間甚至只剩下 6.19MB 的空間。typescript
可看出兩張系統關鍵表空間的使用率已經不容樂觀。急需找出佔用空間的幕後兇手,並將之繩之以法。shell
02--AWRINFO腳本初步診斷數據庫
經過 Oracle 數據庫自帶的 awrinfo 腳本進行初步診斷,下邊截取關鍵內容,可獲得以下信息,快照過時信息是佔用 SYSAUX 的元兇.數組
注:awrinfo.sql 是個很不錯的工具,第一次使用,這裏重點記錄一下,使用 ?/rdbms/admin/awrinfo.sql 能夠查看 awr 的數據使用狀況。bash
開頭顯示 AWR 的設置信息,快照保留 40 天,每隔 30 分鐘生成一個快照。後邊即是一些對象佔用的大小以及明細。
微信
03--v$sysaux_occupants視圖查詢明細
進一步查詢 SYSAUX 表空間使用詳細狀況:
SQL> select owner,segment_name,partition_name,bytes/1024/1024 from dba_segments where tablespace_name='SYSAUX' order by 4 desc where rownum <=20;
OWNER SEGMENT_NAME PARTITION_NAME BYTES/1024/1024 ------------------------------ --------------------------------------------------------------------------------- ------------------------------ --------------- SYS WRH$_ACTIVE_SESSION_HISTORY WRH$_ACTIVE_1404287032_0 7907 SYS WRH$_EVENT_HISTOGRAM_PK WRH$_EVENT__1404287032_0 3627 SYS WRH$_EVENT_HISTOGRAM WRH$_EVENT__1404287032_0 2560 SYS WRH$_LATCH WRH$_LATCH_1404287032_0 1600 SYS WRH$_SYSSTAT_PK WRH$_SYSSTA_1404287032_0 1472 SYS WRH$_LATCH_MISSES_SUMMARY_PK WRH$_LATCH__1404287032_0 1408 SYS WRH$_SQLSTAT WRH$_SQLSTA_1404287032_0 1344 SYS WRH$_LATCH_PK WRH$_LATCH_1404287032_0 1216 SYS WRH$_LATCH_MISSES_SUMMARY WRH$_LATCH__1404287032_0 1152 SYS WRH$_SYSSTAT WRH$_SYSSTA_1404287032_0 1088 SYS WRH$_ACTIVE_SESSION_HISTORY_PK WRH$_ACTIVE_1404287032_0 935 SYS WRH$_PARAMETER_PK WRH$_PARAME_1404287032_0 896 SYS WRH$_PARAMETER WRH$_PARAME_1404287032_0 759 SYS WRH$_SEG_STAT WRH$_SEG_ST_1404287032_0 712 SYS WRH$_SYSTEM_EVENT WRH$_SYSTEM_1404287032_0 688 SYS WRH$_SYSTEM_EVENT_PK WRH$_SYSTEM_1404287032_0 504 SYS WRH$_SERVICE_STAT_PK WRH$_SERVIC_1404287032_0 408 SYS WRH$_SQLSTAT_PK WRH$_SQLSTA_1404287032_0 352 SYS WRH$_DLM_MISC WRH$_DLM_MI_1404287032_0 320 SYS WRH$_DLM_MISC_PK WRH$_DLM_MI_1404287032_0 280 SYS WRH$_SEG_STAT_PK WRH$_SEG_ST_1404287032_0 256
查詢 v$sysaux_occupants 視圖,咱們能夠肯定佔用 SYSAUX 表空間過多的大部分都是AWR 的基表,因此,根據實際業務需求,刪除部分 AWR 數據理論上就能夠回收一部分 SYSAUX 表空間,在 Oracle 中,一般 AWR 信息都會設置保留期限,Oracle 10g 版本默認保留7天,Oracle 11g 版本默認保留 8 天,能夠經過 dba_hist_wr_control 視圖來查看保留期限。也能夠手動更改 AWR 保留時間,設置 AWR 基線。咱們生產環境一般保留 40 天,每半個小時生成一份快照。
select * from dba_hist_wr_control;
這裏看全是 awr 的相關內容,須要重建 awr 來釋放空間,具體重建步驟,請參考博文:http://blog.itpub.net/20893244/viewspace-2146541/
~~~~~~~~~~~~~~臨時刪除的辦法~~~~~~~~~~~~~~~··
truncate table WRH$_ACTIVE_SESSION_HISTORY;truncate table WRH$_EVENT_HISTOGRAM;truncate table WRH$_SQLSTAT;truncate table WRH$_LATCH_MISSES_SUMMARY;truncate table WRH$_LATCH;truncate table WRH$_SYSSTAT;truncate table WRH$_SEG_STAT;truncate table WRH$_PARAMETER;truncate table WRH$_SYSTEM_EVENT;truncate table WRH$_SQL_PLAN;truncate table WRH$_DLM_MISC;truncate table WRH$_SERVICE_STAT;truncate table WRH$_TABLESPACE_STAT;truncate table WRH$_ROWCACHE_SUMMARY;truncate table WRH$_MVPARAMETER;
根據腳本清除 WRH$% 相關表:
col "'truncate table '||segment_name||';'" for a66set line 345 pages 345select distinct 'truncate table '||segment_name||';',s.bytes/1024/1024 ToTAL_MB 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;
04-順帶AWR講解
既然說到這裏,就順帶一下 AWR 的平常操做:
AWR (Automatic Workload Repository)一堆歷史性能數據,放在 SYSAUX 表空間上, AWR 和 SYSAUX 都是10g 出現的,是 Oracle 調優的關鍵特性;大約 1999 年左右開始開發,已經有約 20 年曆史.主要是 MMON(Manageability Monitor Process) 和它的小工進程 (m00x) 來維護 AWR。
#手動執行一個快照: Exec dbms_workload_repository.create_snapshot; #建立一個AWR基線 Exec DBMS_WORKLOAD_REPOSITORY.CREATE_BASELINE(start_snap_id,end_snap_id ,baseline_name);#單節點AWR報告 @?/rdbms/awrrpt.sql#AWR比對報告 @?/rdbms/admin/awrddrpt #RAC 全局AWR @?/rdbms/admin/awrgrpt#RAC中可選擇節點生成AWR報告 @?/rdbms/admin/awrrpti
05--AWR過時快照信息清理
在本案例中,Oracle 版本爲 11.2.0.4.0,AWR 默認保留期限 8 天。可是爲何會佔用這麼多SYSAUX 表空間呢?首先,要明確 AWR 快照信息的刪除方式:AWR 報告默認是採起DELETE 的方式進行過時信息刪除的,相比 TRUNCATE 而言,就會產生大量的碎片,對於開啓了自動擴展數據文件的表空間而言,碎片的現會象更加嚴重。再有一點,ASH 的信息在有可能不受 AWR 快照保留策略的控制。從以下 SQL 查詢可得知,從 SNAP_ID 爲 1 的快照到目前爲止的全部快照都還在數據庫中保存着,致使 WRH$_ACTIVE_SESSION_HISTORY 表很大,使用 DBMS_WORKLOAD_REPOSITORY 包清理過時或者不須要的 AWR 數據,能夠回收這部分空間。
SQL> select min(snap_id),max(snap_id) from wrh$_active_session_history;
MIN(SNAP_ID) MAX(SNAP_ID) ------------ ------------ 1 25444
經過DBMS_WORKLOAD_REPOSITORY包清理快照信息:
exec DBMS_WORKLOAD_REPOSITORY.DROP_SNAPSHOT_RANGE (low_snap_id =>1,high_snap_id => 18000);
PL/SQL procedure successfully completed.
可是,經過這種方式清理的 AWR 信息,再次查看 SYSAUX 表空間的空間,發現空間並無被回收,使用率還和以前同樣,這是由於清理 AWR 操做是經過 DELETE 操做實現的,表的水位線並無降低致使的。可是經過再次查詢 WRH$_ACTIVE_SESSION_HISTORY 可發現表記錄已經少了。可是表大小仍是沒有變化。
06--對分區進行 MOVE 操做,回收表空間
經過上邊查詢出來的 SYSAUX 表空間佔用分佈狀況,將佔用空間較大的對象進行MOVE操做,回收表空間。
①首先查看錶的分區狀況以及大小
select segment_name,partition_name,bytes/1024/1024/1024 gb from dba_segments where segment_name='WRH$_EVENT_HISTOGRAM';
②對分區表進行 MOVE 操做,回收空間
alter table WRH$_EVENT_HISTOGRAM move partition WRH$_EVENT__1404287032_0;alter table WRH$_EVENT_HISTOGRAM move partition WRH$_EVENT_HISTO_MXDB_MXSN;
③MOVE後,重建分區表索引
#查看分區表索引信息select index_name from dba_indexes where table_name='WRH$_EVENT_HISTOGRAM';#重建分區表索引where table_name='WRH$_EVENT_HISTOGRAM'; select index_name from dba_indexes INDEX_NAME------------------------------ _EVENT_HISTOGRAM_PK$_EVENT_HISTOGRAM_PK rebuild partition WRH$_EVENT__1404287032_0; alter index WRH$_EVENT_HISTOGRAM_PK rebuild partition WRH$_EVENT_HISTO_MXDB_MXSN; alter index WRH
如下是相關操做參考:
SQL> select segment_name,partition_name,bytes/1024/1024/1024 gb from dba_segments where segment_name='WRH$_EVENT_HISTOGRAM';SEGMENT_NAME PARTITION_NAME GB--------------------------------------------------------------------------------- ------------------------------ ----------WRH$_EVENT_HISTOGRAM WRH$_EVENT__1404287032_0 2.5WRH$_EVENT_HISTOGRAM WRH$_EVENT_HISTO_MXDB_MXSN .000061035SQL> alter table WRH$_EVENT_HISTOGRAM move partition WRH$_EVENT__1404287032_0;
Table altered.
SQL> alter table WRH$_EVENT_HISTOGRAM move partition WRH$_EVENT_HISTO_MXDB_MXSN;
Table altered.SQL> select index_name from dba_indexes where table_name='WRH$_EVENT_HISTOGRAM';
INDEX_NAME------------------------------WRH$_EVENT_HISTOGRAM_PK
SQL> alter index WRH$_EVENT_HISTOGRAM_PK rebuild partition WRH$_EVENT__1404287032_0;
Index altered.
SQL> alter index WRH$_EVENT_HISTOGRAM_PK rebuild partition WRH$_EVENT_HISTO_MXDB_MXSN;
Index altered.
SQL> select sum(bytes)/1024/1024 from dba_segments where segment_name='WRH$_EVENT_HISTOGRAM';
SUM(BYTES)/1024/1024-------------------- .125
SQL> select segment_name,partition_name,bytes/1024/1024/1024 gb from dba_segments where segment_name='WRH$_LATCH';
SEGMENT_NAME PARTITION_NAME GB--------------------------------------------------------------------------------- ------------------------------ ----------WRH$_LATCH WRH$_LATCH_MXDB_MXSN .000061035WRH$_LATCH WRH$_LATCH_1404287032_0 1.5625
SQL> alter table WRH$_LATCH move partition WRH$_LATCH_1404287032_0;
Table altered.
SQL> alter table WRH$_LATCH move partition WRH$_LATCH_MXDB_MXSN;
Table altered.
SQL> select index_name from dba_indexes where table_name='WRH$_LATCH';
INDEX_NAME------------------------------WRH$_LATCH_PK
SQL> alter index WRH$_LATCH_PK rebuild partition WRH$_LATCH_1404287032_0;
Index altered.
SQL> alter index WRH$_LATCH_PK rebuild partition WRH$_LATCH_MXDB_MXSN;
Index altered.
SQL> select segment_name,partition_name,bytes/1024/1024/1024 gb from dba_segments where segment_name='WRH$_LATCH';
SEGMENT_NAME PARTITION_NAME GB--------------------------------------------------------------------------------- ------------------------------ ----------WRH$_LATCH WRH$_LATCH_MXDB_MXSN .000061035WRH$_LATCH WRH$_LATCH_1404287032_0 .000061035
SQL> select segment_name,partition_name,bytes/1024/1024/1024 gb from dba_segments where segment_name='WRH$_SYSSTAT';
SEGMENT_NAME PARTITION_NAME GB--------------------------------------------------------------------------------- ------------------------------ ----------WRH$_SYSSTAT WRH$_SYSSTA_1404287032_0 1.0625WRH$_SYSSTAT WRH$_SYSSTAT_MXDB_MXSN .000061035
SQL> alter table WRH$_SYSSTAT move partition WRH$_SYSSTA_1404287032_0;
Table altered.
SQL> alter table WRH$_SYSSTAT move partition WRH$_SYSSTAT_MXDB_MXSN;
Table altered.
SQL> select index_name from dba_indexes where table_name='WRH$_SYSSTAT';
INDEX_NAME------------------------------WRH$_SYSSTAT_PK
SQL> alter index WRH$_SYSSTAT_PK rebuild partition WRH$_LATCH_1404287032_0;alter index WRH$_SYSSTAT_PK rebuild partition WRH$_LATCH_1404287032_0 *ERROR at line 1:ORA-02149: Specified partition does not exist
SQL> alter index WRH$_SYSSTAT_PK rebuild partition WRH$_SYSSTA_1404287032_0;
Index altered.
SQL> alter index WRH$_SYSSTAT_PK rebuild partition WRH$_SYSSTAT_MXDB_MXSN;
Index altered.
SQL> select segment_name,partition_name,bytes/1024/1024/1024 gb from dba_segments where segment_name='WRH$_SYSSTAT';
SEGMENT_NAME PARTITION_NAME GB--------------------------------------------------------------------------------- ------------------------------ ----------WRH$_SYSSTAT WRH$_SYSSTA_1404287032_0 .000061035WRH$_SYSSTAT WRH$_SYSSTAT_MXDB_MXSN .000061035
SQL> select segment_name,partition_name,bytes/1024/1024/1024 gb from dba_segments where segment_name='WRH$_LATCH_MISSES_SUMMARY';
SEGMENT_NAME PARTITION_NAME GB--------------------------------------------------------------------------------- ------------------------------ ----------WRH$_LATCH_MISSES_SUMMARY WRH$_LATCH__1404287032_0 1.125WRH$_LATCH_MISSES_SUMMARY WRH$_LATCH_MISSE_MXDB_MXSN .000061035
SQL> alter index WRH$_LATCH_MISSES_SUMMARY_PK rebuild partition WRH$_LATCH__1404287032_0;
Index altered.
SQL> select segment_name,partition_name,bytes/1024/1024/1024 gb from dba_segments where segment_name='WRH$_LATCH_MISSES_SUMMARY';
SEGMENT_NAME PARTITION_NAME GB--------------------------------------------------------------------------------- ------------------------------ ----------WRH$_LATCH_MISSES_SUMMARY WRH$_LATCH__1404287032_0 1.125WRH$_LATCH_MISSES_SUMMARY WRH$_LATCH_MISSE_MXDB_MXSN .000061035
SQL> alter table WRH$_LATCH_MISSES_SUMMARY move partition WRH$_LATCH__1404287032_0;
Table altered.
SQL> alter table WRH$_LATCH_MISSES_SUMMARY move partition WRH$_LATCH_MISSE_MXDB_MXSN;
Table altered.
SQL> alter index WRH$_LATCH_MISSES_SUMMARY_PK rebuild partition WRH$_LATCH__1404287032_0;
Index altered.
SQL> alter index WRH$_LATCH_MISSES_SUMMARY_PK rebuild partition WRH$_LATCH_MISSE_MXDB_MXSN;
Index altered.
SQL> select segment_name,partition_name,bytes/1024/1024/1024 gb from dba_segments where segment_name='WRH$_LATCH_MISSES_SUMMARY';
SEGMENT_NAME PARTITION_NAME GB--------------------------------------------------------------------------------- ------------------------------ ----------WRH$_LATCH_MISSES_SUMMARY WRH$_LATCH__1404287032_0 .000061035WRH$_LATCH_MISSES_SUMMARY WRH$_LATCH_MISSE_MXDB_MXSN .000061035
07--SYSTEM表空間回收
查詢得知,SYSTEM 表空間大多被 AUD$ 佔用,即 Oracle 數據庫審計信息,對於審計信息,如無特殊需求,能夠直接經過 truncate 便可回收 SYSTEM 表空間。相比 SYSAUX 而言,是否是簡單不少。要注意,SYSTEM 表空間的平常備份,以及空間預警。
TRUNCATE TABLE AUD$;
08--擴展點--High Water Mark 水位線
在清理 SYSAUX 表空間時,發現經過 DBMS_WORKLOAD_REPOSITORY 包清理快照信息時,SYSAUX 表空間並未釋放,這裏涉及到一個 Oracle 數據庫中一個關於 Segment(段)的關鍵概念---HWM(High Water Mark),段中用於表示已使用和未使用空間的邊界。
##Oracle官方文檔給出的簡要解釋high water mark (HWM)The boundary between used and unused space in a segment.
那麼,在 Oracle 數據庫中,Segment 是什麼呢?Segment 是佔用磁盤空間的一個對象,好比咱們常見的Table(表)、表分區、Cluster(聚簇)、Index索引、索引分區、LOB分區、嵌套表、回滾段等,都是不一樣類型的Segment(段)。
##Oracle官方定義的Segment概念segmentA set of extents allocated for a specific database object such as a table, index, or table cluster. User segments, undo segments, and temporary segments are all types of segments.
在Oracle9i 以前,Oracle 數據庫中,段空間的管理方式是 MSSM--manual segment space management,手動段空間管理,段空間的觀念裏和分配須要調整不少參數進行管理,很是之繁瑣。好比 FREELISTS 等參數,關鍵是這些參數配置正確合理與否,對 Oracle 數據庫的性能影響很是之大。表的剩餘空間的管理與分配都是由連接列表 freelist 來完成的,由於 freelist存在串行的問題所以容易引發每每容易引發段頭的爭用與空間的浪費,最主要的仍是由於須要人爲的花費大量的精力和時間去管理這些爭用並監控表的空間利用。
從Oracle9i開始,Oracle數據庫推出了ASSM,詳見ASSM官網說明,automatic segment space management,自動段空間管理。ASSM,連接列表freelist被位圖所取代,它是一個二進制的數組,可以效地管理存儲擴展和剩餘區塊(free block)。
高水位線就是數據塊在一個段內歷史週期內達到的最大的位置,高水位線只增不減,只升不降,直到這個segment對象被truncate,纔會下降。這裏這個高水位線對數據庫性能的影響仍是有的。爲何不會釋放呢?
①空間利用率:
上述文中,若是不對錶分區進行 MOVE,那個高水位線是不會下降的,刪除的數據本質上是經過DELETE語句去刪除的,可是這部分的空間(EXTEND)仍是屬於它原有的段(Segment),不能被其餘對象所使用,在表空間沒法自動擴展或者未開啓自動擴展的狀況下,這些空間(EXTEND)只能是原來所屬表新增數據進行使用;若是在開啓了自動擴展的表空間下,且未達到上限的表空間中,這部分的空間將被「遺忘」,沒法被再次利用,這就會致使碎片化,DELETE後的空間是沒法被其餘對象使用的。
②性能影響:
在Oracle數據庫中,全表掃描時,會對 HWM 高水位線如下的全部數據塊進行掃描,雖然數據塊中沒有任何數據,可是也會一一進行掃描,這對資源是一種沒必要要的消耗,並且會對數據庫的性能產生影響。
參考連接:
https://www.linuxidc.com/Linux/2017-12/149979.htm
https://www.cnblogs.com/acdante/archive/2018/07/04/9228457.html
天天進步一點,一年後的進步將會很大,遠遠大於 「1」;天天退步,即便退步一點點,一年後幾乎退步爲 "0"。若是本文對你有幫助,請多支持「在看」與轉發。
![](http://static.javashuo.com/static/loading.gif)
Oracle 12c 及以上版本補丁更新說明及下載方法(收藏版)
Oracle 11.2.0.4 RAC 最新補丁下載(11.2.0.4.200714)
11g RAC 在線存儲遷移實現 OCR 磁盤組完美替換
個人 OCM 之路|書寫無悔青春,追夢永不止步
Oracle 19c 之多租戶 PDB 鏈接與訪問(三)
案例:RMAN 備份控制文件報錯 ORA-00230
Oracle 12C 最新補丁下載與安裝操做指北
DBA 經常使用的軟件工具備哪些(分享篇)?
Oracle 相關認證證書查詢及真僞辨別
Oracle 每日一題系列合集
![](http://static.javashuo.com/static/loading.gif)
![](http://static.javashuo.com/static/loading.gif)
![公衆號二維碼.jpg](http://static.javashuo.com/static/loading.gif)
![](http://static.javashuo.com/static/loading.gif)
點亮在看,你最好看!
本文分享自微信公衆號 - JiekeXu之路(JiekeXu_IT)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。