0x00--目的
整理一下以前一個SYSTEM表空間和SYSAUX表空間使用率達到99%上限的處理思路和相關知識點,好記性不如爛筆頭
0x01--表空間使用率現狀
通過查詢可得知目前表空間使用情況如下圖:可看到SYSAUX表空間和SYSTEM表空間使用率都已經高達99%,SYSAUX表空間甚至只剩下6.19MB的空間空間。
可看出兩張系統關鍵表空間的使用率已經不容樂觀。急需找出占用空間的幕后凶手!並將之繩之以法

0x02--AWRINFO腳本初步診斷
通過Oracle數據庫自帶的awrinfo腳本進行初步診斷,下邊截取關鍵內容,可得到如下信息,快照過期信息是占用SYSAUX的元凶

0x03--v$sysaux_occupants視圖查詢明細
進一步查詢SYSAUX表空間使用詳細情況:
1 SQL> select owner,segment_name,partition_name,bytes/1024/1024 from dba_segments where tablespace_name='SYSAUX' order by 4 desc where rownum <=20; 2 3 OWNER SEGMENT_NAME PARTITION_NAME BYTES/1024/1024 4 ------------------------------ --------------------------------------------------------------------------------- ------------------------------ --------------- 5 SYS WRH$_ACTIVE_SESSION_HISTORY WRH$_ACTIVE_1404287032_0 7907 6 SYS WRH$_EVENT_HISTOGRAM_PK WRH$_EVENT__1404287032_0 3627 7 SYS WRH$_EVENT_HISTOGRAM WRH$_EVENT__1404287032_0 2560 8 SYS WRH$_LATCH WRH$_LATCH_1404287032_0 1600 9 SYS WRH$_SYSSTAT_PK WRH$_SYSSTA_1404287032_0 1472 10 SYS WRH$_LATCH_MISSES_SUMMARY_PK WRH$_LATCH__1404287032_0 1408 11 SYS WRH$_SQLSTAT WRH$_SQLSTA_1404287032_0 1344 12 SYS WRH$_LATCH_PK WRH$_LATCH_1404287032_0 1216 13 SYS WRH$_LATCH_MISSES_SUMMARY WRH$_LATCH__1404287032_0 1152 14 SYS WRH$_SYSSTAT WRH$_SYSSTA_1404287032_0 1088 15 SYS WRH$_ACTIVE_SESSION_HISTORY_PK WRH$_ACTIVE_1404287032_0 935 16 SYS WRH$_PARAMETER_PK WRH$_PARAME_1404287032_0 896 17 SYS WRH$_PARAMETER WRH$_PARAME_1404287032_0 759 18 SYS WRH$_SEG_STAT WRH$_SEG_ST_1404287032_0 712 19 SYS WRH$_SYSTEM_EVENT WRH$_SYSTEM_1404287032_0 688 20 SYS WRH$_SYSTEM_EVENT_PK WRH$_SYSTEM_1404287032_0 504 21 SYS WRH$_SERVICE_STAT_PK WRH$_SERVIC_1404287032_0 408 22 SYS WRH$_SQLSTAT_PK WRH$_SQLSTA_1404287032_0 352 23 SYS WRH$_DLM_MISC WRH$_DLM_MI_1404287032_0 320 24 SYS WRH$_DLM_MISC_PK WRH$_DLM_MI_1404287032_0 280 25 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基線。
1 select * from dba_hist_wr_control;
0x04-順帶AWR講解
既然說到這里,就順帶一下AWR的日常操作:
AWR (Automatic Workload Repository) 一堆歷史性能數據,放在SYSAUX表空間上, AWR和SYSAUX都是10g出現的,是Oracle調優的關鍵特性; 大約1999年左右開始開發,已經有約20年歷史 主要是MMON(Manageability Monitor Process)和它的小工進程(m00x)來維護AWR。
1 ##手動執行一個快照: 2 Exec dbms_workload_repository.create_snapshot; 3 ##創建一個AWR基線 4 Exec DBMS_WORKLOAD_REPOSITORY.CREATE_BASELINE(start_snap_id,end_snap_id ,baseline_name); 5 ##單節點AWR報告 6 @?/rdbms/awrrpt.sql 7 ##AWR比對報告 8 @?/rdbms/admin/awrddrpt 9 ##RAC 全局AWR 10 @?/rdbms/admin/awrgrpt 11 ##RAC中可選擇節點生成AWR報告 12 @?/rdbms/admin/awrrpti
0x05--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數據,可以回收這部分空間。
1 SQL> select min(snap_id),max(snap_id) from wrh$_active_session_history; 2 3 MIN(SNAP_ID) MAX(SNAP_ID) 4 ------------ ------------ 5 1 25444
通過DBMS_WORKLOAD_REPOSITORY包清理快照信息:
1 exec DBMS_WORKLOAD_REPOSITORY.DROP_SNAPSHOT_RANGE (low_snap_id =>1,high_snap_id => 18000); 2 PL/SQL procedure successfully completed.
但是,通過這種方式清理的AWR信息,再次查看SYSAUX表空間的空間,發現空間並沒有被回收,使用率還和之前一樣,這是因為清理AWR操作是通過DELETE操作實現的,表的水位線並沒有下降導致的。但是通過再次查詢WRH$_ACTIVE_SESSION_HISTORY可發現表記錄已經少了。但是表大小還是沒有變化。

0x06--對分區進行MOVE操作,回收表空間
通過上邊查詢出來的SYSAUX表空間占用分布情況,將占用空間較大的對象進行MOVE操作,回收表空間。
①首先查看表的分區情況以及大小
1 select segment_name,partition_name,bytes/1024/1024/1024 gb from dba_segments where segment_name='WRH$_EVENT_HISTOGRAM';
②對分區表進行MOVE操作,回收空間
1 alter table WRH$_EVENT_HISTOGRAM move partition WRH$_EVENT__1404287032_0;
2 alter table WRH$_EVENT_HISTOGRAM move partition WRH$_EVENT_HISTO_MXDB_MXSN;
③MOVE后,重建分區表索引
1 ##查看分區表索引信息 2 select index_name from dba_indexes where table_name='WRH$_EVENT_HISTOGRAM'; 3 ##重建分區表索引 4 SQL> select index_name from dba_indexes where table_name='WRH$_EVENT_HISTOGRAM'; 5 INDEX_NAME 6 ------------------------------ 7 WRH$_EVENT_HISTOGRAM_PK
8 SQL> alter index WRH$_EVENT_HISTOGRAM_PK rebuild partition WRH$_EVENT__1404287032_0; 9 SQL> alter index WRH$_EVENT_HISTOGRAM_PK rebuild partition WRH$_EVENT_HISTO_MXDB_MXSN;
以下是操作參考:
1 SQL> select segment_name,partition_name,bytes/1024/1024/1024 gb from dba_segments where segment_name='WRH$_EVENT_HISTOGRAM'; 2 SEGMENT_NAME PARTITION_NAME GB 3 --------------------------------------------------------------------------------- ------------------------------ ---------- 4 WRH$_EVENT_HISTOGRAM WRH$_EVENT__1404287032_0 2.5 5 WRH$_EVENT_HISTOGRAM WRH$_EVENT_HISTO_MXDB_MXSN .000061035 6 SQL> alter table WRH$_EVENT_HISTOGRAM move partition WRH$_EVENT__1404287032_0; 7 8 Table altered. 9 10 SQL> alter table WRH$_EVENT_HISTOGRAM move partition WRH$_EVENT_HISTO_MXDB_MXSN; 11 12 Table altered. 13 SQL> select index_name from dba_indexes where table_name='WRH$_EVENT_HISTOGRAM'; 14 15 INDEX_NAME 16 ------------------------------ 17 WRH$_EVENT_HISTOGRAM_PK 18 19 SQL> alter index WRH$_EVENT_HISTOGRAM_PK rebuild partition WRH$_EVENT__1404287032_0; 20 21 Index altered. 22 23 SQL> alter index WRH$_EVENT_HISTOGRAM_PK rebuild partition WRH$_EVENT_HISTO_MXDB_MXSN; 24 25 Index altered. 26 27 SQL> select sum(bytes)/1024/1024 from dba_segments where segment_name='WRH$_EVENT_HISTOGRAM'; 28 29 SUM(BYTES)/1024/1024 30 -------------------- 31 .125 32 33 SQL> select segment_name,partition_name,bytes/1024/1024/1024 gb from dba_segments where segment_name='WRH$_LATCH'; 34 35 SEGMENT_NAME PARTITION_NAME GB 36 --------------------------------------------------------------------------------- ------------------------------ ---------- 37 WRH$_LATCH WRH$_LATCH_MXDB_MXSN .000061035 38 WRH$_LATCH WRH$_LATCH_1404287032_0 1.5625 39 40 SQL> alter table WRH$_LATCH move partition WRH$_LATCH_1404287032_0; 41 42 Table altered. 43 44 SQL> alter table WRH$_LATCH move partition WRH$_LATCH_MXDB_MXSN; 45 46 Table altered. 47 48 SQL> select index_name from dba_indexes where table_name='WRH$_LATCH'; 49 50 INDEX_NAME 51 ------------------------------ 52 WRH$_LATCH_PK 53 54 SQL> alter index WRH$_LATCH_PK rebuild partition WRH$_LATCH_1404287032_0; 55 56 Index altered. 57 58 SQL> alter index WRH$_LATCH_PK rebuild partition WRH$_LATCH_MXDB_MXSN; 59 60 Index altered. 61 62 SQL> select segment_name,partition_name,bytes/1024/1024/1024 gb from dba_segments where segment_name='WRH$_LATCH'; 63 64 SEGMENT_NAME PARTITION_NAME GB 65 --------------------------------------------------------------------------------- ------------------------------ ---------- 66 WRH$_LATCH WRH$_LATCH_MXDB_MXSN .000061035 67 WRH$_LATCH WRH$_LATCH_1404287032_0 .000061035 68 69 SQL> select segment_name,partition_name,bytes/1024/1024/1024 gb from dba_segments where segment_name='WRH$_SYSSTAT'; 70 71 SEGMENT_NAME PARTITION_NAME GB 72 --------------------------------------------------------------------------------- ------------------------------ ---------- 73 WRH$_SYSSTAT WRH$_SYSSTA_1404287032_0 1.0625 74 WRH$_SYSSTAT WRH$_SYSSTAT_MXDB_MXSN .000061035 75 76 SQL> alter table WRH$_SYSSTAT move partition WRH$_SYSSTA_1404287032_0; 77 78 Table altered. 79 80 SQL> alter table WRH$_SYSSTAT move partition WRH$_SYSSTAT_MXDB_MXSN; 81 82 Table altered. 83 84 SQL> select index_name from dba_indexes where table_name='WRH$_SYSSTAT'; 85 86 INDEX_NAME 87 ------------------------------ 88 WRH$_SYSSTAT_PK 89 90 SQL> alter index WRH$_SYSSTAT_PK rebuild partition WRH$_LATCH_1404287032_0; 91 alter index WRH$_SYSSTAT_PK rebuild partition WRH$_LATCH_1404287032_0 92 * 93 ERROR at line 1: 94 ORA-02149: Specified partition does not exist 95 96 97 SQL> alter index WRH$_SYSSTAT_PK rebuild partition WRH$_SYSSTA_1404287032_0; 98 99 Index altered. 100 101 SQL> alter index WRH$_SYSSTAT_PK rebuild partition WRH$_SYSSTAT_MXDB_MXSN; 102 103 Index altered. 104 105 SQL> select segment_name,partition_name,bytes/1024/1024/1024 gb from dba_segments where segment_name='WRH$_SYSSTAT'; 106 107 SEGMENT_NAME PARTITION_NAME GB 108 --------------------------------------------------------------------------------- ------------------------------ ---------- 109 WRH$_SYSSTAT WRH$_SYSSTA_1404287032_0 .000061035 110 WRH$_SYSSTAT WRH$_SYSSTAT_MXDB_MXSN .000061035 111 112 SQL> select segment_name,partition_name,bytes/1024/1024/1024 gb from dba_segments where segment_name='WRH$_LATCH_MISSES_SUMMARY'; 113 114 SEGMENT_NAME PARTITION_NAME GB 115 --------------------------------------------------------------------------------- ------------------------------ ---------- 116 WRH$_LATCH_MISSES_SUMMARY WRH$_LATCH__1404287032_0 1.125 117 WRH$_LATCH_MISSES_SUMMARY WRH$_LATCH_MISSE_MXDB_MXSN .000061035 118 119 SQL> alter index WRH$_LATCH_MISSES_SUMMARY_PK rebuild partition WRH$_LATCH__1404287032_0; 120 121 Index altered. 122 123 SQL> select segment_name,partition_name,bytes/1024/1024/1024 gb from dba_segments where segment_name='WRH$_LATCH_MISSES_SUMMARY'; 124 125 SEGMENT_NAME PARTITION_NAME GB 126 --------------------------------------------------------------------------------- ------------------------------ ---------- 127 WRH$_LATCH_MISSES_SUMMARY WRH$_LATCH__1404287032_0 1.125 128 WRH$_LATCH_MISSES_SUMMARY WRH$_LATCH_MISSE_MXDB_MXSN .000061035 129 130 SQL> alter table WRH$_LATCH_MISSES_SUMMARY move partition WRH$_LATCH__1404287032_0; 131 132 Table altered. 133 134 SQL> alter table WRH$_LATCH_MISSES_SUMMARY move partition WRH$_LATCH_MISSE_MXDB_MXSN; 135 136 Table altered. 137 138 SQL> alter index WRH$_LATCH_MISSES_SUMMARY_PK rebuild partition WRH$_LATCH__1404287032_0; 139 140 Index altered. 141 142 SQL> alter index WRH$_LATCH_MISSES_SUMMARY_PK rebuild partition WRH$_LATCH_MISSE_MXDB_MXSN; 143 144 Index altered. 145 146 SQL> select segment_name,partition_name,bytes/1024/1024/1024 gb from dba_segments where segment_name='WRH$_LATCH_MISSES_SUMMARY'; 147 148 SEGMENT_NAME PARTITION_NAME GB 149 --------------------------------------------------------------------------------- ------------------------------ ---------- 150 WRH$_LATCH_MISSES_SUMMARY WRH$_LATCH__1404287032_0 .000061035 151 WRH$_LATCH_MISSES_SUMMARY WRH$_LATCH_MISSE_MXDB_MXSN .000061035
0x07--SYSTEM表空間回收
查詢得知,SYSTEM表空間大多被AUD$占用,即Oracle數據庫審計信息,對於審計信息,如無特殊需求,可以直接通過truncate即可回收SYSTEM表空間。相比SYSAUX而言,是不是簡單很多。要注意,SYSTEM表空間的日常備份,以及空間預警。
1 TRUNCATE TABLE AUD$;
0x08--擴展點--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概念 segment A 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高水位線以下的所有數據塊進行掃描,雖然數據塊中沒有任何數據,但是也會一一進行掃描,這對資源是一種不必要的消耗,而且會對數據庫的性能產生影響。
再下去就要說說行遷移、行鏈接以及ASSM相關參數,PCTFREE,PCTUSED,BUFFER_POOL等等,之后再詳細記錄吧。
