由Oracle 11g SYSAUX 和 SYSTEM 表空間回收引發的聯想


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等等,之后再詳細記錄吧。

 


免責聲明!

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



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