由Oracle Bug引起的AWR Snapshot收集故障
AWR報告是Oracle從10g開始引入的一項重要效能特性。以9i可選元件Statspack為基礎,藉助自動週期作業,我們可以獲得一系列的Oracle效能片段,從而在出現效能問題的時候更加從容。
AWR引入的一個結果,就是系統需要根據配置內容將效能資料儲存在資料庫中。從10g之後,sysaux表空間從system表空間從脫離開來,就提供了這種可能性。我們在實際運維工作中,是可能會遇到AWR後設資料引起的故障問題。本篇主要介紹這個案例,留待需要同仁待查。
1、問題說明
運維人員都有“節日休假恐怖症”,越到節日、休假和外出出差,系統越可能出現問題。筆者在進行一個系統的例行檢查時,出現了問題。
資料庫版本為11gR2,具體版本編號為11.2.0.3。
SQL> select * from v$version;
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
PL/SQL Release 11.2.0.3.0 - Production
CORE 11.2.0.3.0 Production
TNS for Linux: Version 11.2.0.3.0 - Production
NLSRTL Version 11.2.0.3.0 – Production
問題發現的由頭是生成AWR報告的時候,發現近幾天都沒有正常生成AWR Snapshot。由於是很少用的系統,所以筆者只在每月進行一次跟蹤。這種情況肯定不正常,進入10g之後,AWR後臺預設每隔一小時,都會自動生成一個Snapshot映象資料。
這種情況,筆者本能想去定位alert log,大部分異常情況,Oracle都會記錄在資料庫中。果然在其中發現了問題。
Wed Sep 30 14:24:15 2015
ORA-1653: unable to extend table SYS.SCHEDULER$_EVENT_LOG by 128 in tablespace SYSAUX
Errors in file /home/oracle/app/diag/rdbms/xxx/xxxdb/trace/xxxdb_j000_3385.trc:
ORA-01653: unable to extend table . by in tablespace
ORA-01653: unable to extend table SYS.SCHEDULER$_EVENT_LOG by 128 in tablespace SYSAUX
Wed Sep 30 15:06:58 2015
ORA-1653: unable to extend table SYS.SCHEDULER$_EVENT_LOG by 128 in tablespace SYSAUX
Errors in file /home/oracle/app/diag/rdbms/xxxdb/xxxdb/trace/xxxdb_j000_5102.trc:
ORA-01653: unable to extend table . by in tablespace
ORA-01653: unable to extend table SYS.SCHEDULER$_EVENT_LOG by 128 in tablespace SYSAUX
從內容上看,是sysaux表空間滿了。預設情況下,Oracle的系統性質表空間都是不支援檔案自動擴充的。如果原有大小寫滿了,同時不支援自動擴充,的確會有報錯異常。
此時,AWR配置內容是預設方式。
SQL> select * from dba_hist_wr_control;
DBID SNAP_INTERVAL RETENTION TOPNSQL
---------- --------------------------------------- --------------------------------------- ----------
1778314713 +00000 01:00:00.0 +00008 00:00:00.0 DEFAULT
預設AWR是每小時儲存一個映象,映象資料會儲存八天。此時,AWR中已經沒有對應的資料映象了。
SQL> select snap_id, dbid, startup_time from dba_hist_snapshot;
SNAP_ID DBID STARTUP_TIME
---------- ---------- --------------------------------------------------------------------------------
2、問題緩解
一般資料庫故障,通常不是一個單獨策略可以解決的。筆者認為:問題分輕重緩急,解決方案也分猛藥溫補。關鍵的取捨取決於不同的場景優先順序別。在這種情況下,恢復AWR工作,增加sysaux表空間儲存是首要需求。
這種操作比較簡單,只要單獨定位和允許檔案自動擴充即可。
SQL> alter database datafile '/data/xxxdb/systs/sysaux01.dbf' autoextend on;
Database altered
SQL> select bytes/1024/1024, AUTOEXTENSIBLE from dba_data_files where tablespace_name='SYSAUX';
BYTES/1024/1024 AUTOEXTENSIBLE
--------------- --------------
1032 YES
Alert log中記錄資訊。
YSAUX
Wed Sep 30 15:30:13 2015
alter database datafile '/data/xxxdb/systs/sysaux01.dbf' autoextend on
Completed: alter database datafile '/data/xxxdb/systs/sysaux01.dbf' autoextend on
手工測試生成AWR映象,判斷問題是否解決。
SQL> exec dbms_workload_repository.create_snapshot;
PL/SQL procedure successfully completed
SQL> select snap_id, to_char(BEGIN_INTERVAL_TIME,'yyyy-mm-dd hh24:mi:ss') from dba_hist_snapshot;
SNAP_ID TO_CHAR(BEGIN_INTERVAL_TIME,'Y
---------- ------------------------------
23383 2015-09-30 15:40:16
在日誌中沒有新的報錯資訊出現。可以認為初步問題解決。下一步就是定位問題:為什麼會出現sysaux爆棚的情況。
3、深層分析過程
AWR和其他一些效能收集,的確是不斷的將資料收集到sysaux表空間裡面進行記錄。筆者一直認為:任何正確的資料架構模式,必要條件之一就是“有進有出”。資料不斷積累,一定要有機制(系統內或者系統外)讓資料可以脫離系統。從微觀角度看,資料表要維持一個穩定的體積容量結構。
AWR系統也的確是這樣。在不斷收集資料的時候,也會依據Retention規則(預設為8天)不斷將資料Purge掉。無論如何設定,sysaux正常情況下應該是一個固定穩定的大小規格。筆者當前資料庫已經執行一兩年的時間,要出問題早就出現問題了。說明系統中,有一些資料在不斷的“默默長大”,問題在不斷的慢慢積累。
嘗試檢查當前sysaux表空間段結構排名,看有沒有與此相關的資訊。
SQL> select owner, segment_name, segment_type, bytes/1024/1024 from (select * from dba_segments where tablespace_name='SYSAUX' order by bytes desc) where rownum<5;
OWNER SEGMENT_NAME SEGMENT_TYPE BYTES/1024/1024
---------- ------------------------------ ------------------ ---------------
SYS WRM$_SNAPSHOT_DETAILS_INDEX INDEX 102
SYS WRM$_SNAPSHOT_DETAILS TABLE 88
SYS SMON_SCN_TO_TIME_AUX CLUSTER 80
XDB SYS_LOB0000057474C00025$$ LOBSEGMENT 53.1875
疑問出現了,最大的幾個物件中,snapshot赫然出現在其中。當前Snapshot裡面沒有資料,無論是被自然purge掉,還是認為刪掉,都不應該有資料存在。檢視基礎資料表:
SQL> select count(*) from WRM$_SNAPSHOT_DETAILS;
COUNT(*)
----------
1723102
SQL> select * from WRM$_SNAPSHOT_DETAILS where rownum<5;
SNAP_ID DBID INSTANCE_NUMBER TABLE_ID BEGIN_TIME
---------- ---------- --------------- ---------- -------------------------------
1 1778314713 1 4 05-12??-12 05.00.08.719 ????
1 1778314713 1 5 05-12??-12 05.00.08.771 ????
1 1778314713 1 6 05-12??-12 05.00.08.841 ????
1 1778314713 1 7 05-12??-12 05.00.08.892 ????
其中資料量還是很大的,重點在於snap_id。
SQL> select max(snap_id), min(snap_id) from WRM$_SNAPSHOT_DETAILS;
MAX(SNAP_ID) MIN(SNAP_ID)
------------ ------------
23383 1
“慢慢變大”的資料找到了,作為AWR基礎的資料,從來就沒有被刪除。手工刪除呢?是不是可以刪除?
SQL> select snap_id from dba_hist_snapshot;
SNAP_ID
----------
23383
SQL> exec dbms_workload_repository.drop_snapshot_range(1,23383);
PL/SQL procedure successfully completed
SQL> select snap_id from dba_hist_snapshot;
SNAP_ID
----------
SQL> select max(snap_id), min(snap_id) from WRM$_SNAPSHOT_DETAILS;
MAX(SNAP_ID) MIN(SNAP_ID)
------------ ------------
23383 1
SQL> select max(snap_id), min(snap_id) from WRM$_SNAPSHOT;
MAX(SNAP_ID) MIN(SNAP_ID)
------------ ------------
刪除的資料,沒有連帶將基礎資料表WRM$_SNAPSHOT_DETAILS內容刪除。詭異的問題!
經過查證MOS,發現該資料表不能刪除是一個Oracle Bug,具體描述如下:
Bug 9797851 - WRM$_SNAPHOST_DETAILS is never purged
The verification criteria for the bug are:
Drop a range of snap id's using dbms_workload_repository.drop_snapshot_range()
Check the corresponding snap id's in WRM$_SNAPSHOT_DETAILS.
If snap id's from the range that you chose to drop are still present, then you are hitting this bug.
The following solutions are available:
The Patch 9797851 for unpublished Bug 9797851 is available for some platforms and can be downloaded from My Oracle Support
If the patch is not available on your platform on a supported version, please contact Oracle Support.
This issue will be fixed from release Oracle 12.1
As a workaround, it is possible to manually purge the range of snap id's from the table WRM$_SNAPSHOT_DETAILS using appropriate delete statments under the guidance of Oracle Support.
其中內容所,如果要解決這個問題,需要進行補丁操作,或者在Oracle Support指導之下手工進行刪除。
由於是生產環境,經過協調,認為當前開啟擴充sysaux策略是可以接受的解決方案。於是筆者打算適可而止,不影響系統正常執行。
4、恢復自動AWR收集
最後需要恢復AWR收集。注意:在一些資料中,建議最開始有一個snapshot,透過手工建立,之後Oracle才能自動的進行生成。
為了快速驗證,調整收集週期是10分鐘。
SQL> exec dbms_workload_repository.create_snapshot;
PL/SQL procedure successfully completed
SQL> exec dbms_workload_repository.modify_snapshot_settings(interval=>10);
PL/SQL procedure successfully completed
SQL> select * from dba_hist_wr_control;
DBID SNAP_INTERVAL RETENTION TOPNSQL
---------- --------------------------------------- --------------------------------------- ----------
1778314713 +00000 00:10:00.0 +00008 00:00:00.0 DEFAULT
經過一段時間,可以看到資料變化。
SQL> select snap_id, to_char(BEGIN_INTERVAL_TIME,'yyyy-mm-dd hh24:mi:ss') from dba_hist_snapshot;
SNAP_ID TO_CHAR(BEGIN_INTERVAL_TIME,'Y
---------- ------------------------------
23384 2015-09-30 16:07:51
SQL> select snap_id, to_char(BEGIN_INTERVAL_TIME,'yyyy-mm-dd hh24:mi:ss') from dba_hist_snapshot;
SNAP_ID TO_CHAR(BEGIN_INTERVAL_TIME,'Y
---------- ------------------------------
23384 2015-09-30 16:07:51
23385 2015-09-30 16:39:32
SQL> select snap_id, to_char(BEGIN_INTERVAL_TIME,'yyyy-mm-dd hh24:mi:ss') from dba_hist_snapshot;
SNAP_ID TO_CHAR(BEGIN_INTERVAL_TIME,'Y
---------- ------------------------------
23384 2015-09-30 16:07:51
23385 2015-09-30 16:39:32
23386 2015-09-30 16:50:17
恢復60分鐘收集。
SQL> exec dbms_workload_repository.modify_snapshot_settings(interval=>60);
PL/SQL procedure successfully completed
問題解決。
5、結論
經過這個案例,筆者的感受有兩條。首先,定期檢查alert log,檢查系統效能資料情況是非常重要的運維手段。要麼依靠自動監控工具,要麼依靠運維人員的日常工作。所謂“養病如養虎,虎大必傷人”在運維領域同樣存在。其次就是“有可為,有可不為”,發現問題時候,要根據情形進行分析,找到技術、管理、業務的平衡點。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/17203031/viewspace-1812898/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 一個由於侵入框架引起的故障框架
- Golang 中由零值和 gob 庫的特性引起的 BUGGolang
- 由於域名解析引起的dataguard傳輸日誌故障
- oracle 10g awr報告的收集Oracle 10g
- 一個oracle查詢引起的bugOracle
- oracle 10g awr效能收集工具的用法Oracle 10g
- 由drop datafile導致的oracle bugOracle
- AWR 及STATSPACK的snapshot不能自動生成排查
- AWR修改收集策略
- Oracle 12.2 physical standby備庫收集AWR報告Oracle
- 由於內部連線引起的Oracle RAC效能問題Oracle
- 由於不同備份策略不相容引起的磁碟空間故障一例
- 由Linux核心bug引起SSH登入緩慢問題的排查與解決Linux
- Oracle目錄由於TFA觸發bug導致jdb檔案未自動清理引起空間不足Oracle
- Oracle資料庫由dataguard備庫引起的log file sync等待Oracle資料庫
- awr自動收集指令碼指令碼
- 由setContentView()方法引起的思考View
- 由程式部署所引起的思考薦
- oracle 11g AWR CPU 顯示Bug 一則Oracle
- iOS Bug收集iOS
- AIX下由於nfs故障導致oracle hangAINFSOracle
- Awr報告停止收集的解決方法
- DNS 引起經典RAC故障DNS
- 由JS註釋引起的JS錯誤JS
- [20171218]修改AWR snapshot 設定.txt
- Subject: "class slave wait" is the top wait event on AWR snapshotAI
- Oracle DBLink bug引發的故障(Session Hang Memory leak)OracleSession
- 談談Bug引起的複雜性“Bug-O” — OverreactedReact
- 故障分析 | show processlist 引起的效能問題
- 磁碟故障引起的系統變慢定位
- 由報警郵件分析發現的備庫oracle bugOracle
- 由門禁系統引起的升級改造
- PHP 由 empty 和 isset 面試題引起的思考PHP面試題
- 由“Windows轉向Linux”引起的思考薦WindowsLinux
- ORACLE AWROracle
- Oracle AWR ---Oracle
- oracle awrOracle
- EMD_MAINTENANCE 引起統計資訊收集AINaN