分析發生在過去的資料庫效能問題
在資料庫執行的過程中,我們有時會碰到資料庫hung住的問題,在這個時候很多人會選擇儘快讓它恢復正常而不是找出問題的root cause. 只有在問題被解決後,才意識到需要找到root cause來避免再次碰到相同的問題; 下面就講講如何分析發生在過去的資料庫效能問題 (這是一篇講方法論的blog,並沒有涉及到具體的案例, 稍後會有更多具體案例的Blog)
1.首先要申明的是, 對於這樣的問題,我們需要有一個正確的期望: 不一定能夠找到root cause, 這取決於發生問題時是否收集到了足夠的資訊.
2.梳理我們可以收集到的資訊, 一般的可以先檢查下面的日誌
a)作業系統日誌, 參照文件 note 1349613.1 - How To Gather The OS Logs For Each Specific OS Platform
b)資料庫alert log
c)作業系統resource(CPU, memory, IO, swapping)使用的狀況, 推薦使用OSWbb (也可以是nmon等第三方工具)
有的時候可以透過上面的日誌找到一些蛛絲馬跡, 比如有時alert log中會提示當時有過多的swap活動, 或提示生成了 enqueue/ row cache enqueue 等等的trace, 或提示diag後臺程式生成了systemstate dump trace, 那麼進一步就是要分析這些trace了;又比如OSWbb的ps輸出顯示當時有很多和資料庫無關的程式在消耗過多的CPU等等, 那麼這就證明問題和資料庫無關了.
3.接下來要收集發生問題時間段的AWR report和ASH report
但是往往發生問題後資料庫被重起了,那麼很不幸AWR report很可能沒有發生問題時間段的資訊, 那麼這樣的AWR對我們分析這個問題就沒有意義了.
ASH在大部分的情況下都是可以收集到發生問題時間段的資訊, 從中可以查到資料庫top的等待事件/session; 然後根據具體的問題,進行進一步的分析
4.如果之前收集到的資訊不足以找出問題的原因, 我們還有一個地方可以查,那就是 dba_hist_active_sess_history.
這個檢視是用來生成ASH report的, 但是ASH report並沒有充分的利用這個檢視的強大之處,我們透過分析這個檢視的詳細資料,往往可以找到問題發生的原因.
可以從宏觀和微觀兩個維度來分析這個檢視(用11gR2的dba_hist_active_sess_history做例子):
比如
宏觀:
a) 可以按照一段時間內(發生問題的時間段)這些session等待的非空閒等待事件的型別做分類和求和,就可以知道哪種等待事件最嚴重
b) 可以按照一段時間內(發生問題的時間段)等待最嚴重事件的這些session所執行的SQL_ID來彙總求和,可以知道哪個SQL跟這個問題相關
…
微觀:
a). 對於某一條dba_hist_active_sess_history的記錄,我們可以知道這個session的SESSION_STATE是ON CPU還是WAITING, 如果是ON CPU,那麼這個session的event就無意義了; 如果是WAITING, 可以進一步看它的等待事件和BLOCKING_SESSION_STATUS, 如果它是被另一個session阻塞, 那麼BLOCKING_SESSION_STATUS這一列就會顯示為VALID或 GLOBAL. 然後再檢查BLOCKING_INST_ID和BLOCKING_SESSION找到阻塞這個session的是哪裡例項上的哪個session
b). 按照SAMPLE_TIME排序,我們可以找到問題發生的具體的時間點 (還是比較精確的)
c). 對某個session, dba_hist_active_sess_history還能揭示更多有用的資訊, 比如這個session當前執行的SQL語句的型別(SQL_OPCODE, SQL_OPNAME), 這個session是否在PARSE(IN_PARSE, IN_HARD_PARSE等), 它是什麼客戶端(PROGRAM, MODULE, ACTION, CLIENT_ID, MACHINE), 它使用的PGA(PGA_ALLOCATED), 它使用的temp空間大小(TEMP_SPACE_ALLOCATED)等等
善於使用 dba_hist_active_sess_history能極大地幫助我們分析問題.但是也要注意dba_hist_active_sess_history不是萬能的: 如果最終阻塞別人的session當時並不是active的或者它並沒有被ASH記錄到dba_hist_active_sess_history中, 我們還是不能知道它當時處於一種什麼狀況.
結語: 總之, 分析類似的問題就是充分挖掘已有的trace/日誌的過程, 但是因為缺少足夠的診斷日誌/資訊,很多時候還是無法找到問題發生的原因. 如果我們確實有需要找到root cause, 那麼在發生問題時就需要收集到足夠多的資訊. 比如hanganalyze, systemstate dump等
轉載自:https://blogs.oracle.com/Database4CN/entry/%E5%A6%82%E4%BD%95%E5%88%86%E6%9E%90%E5%8F%91%E7%94%9F%E5%9C%A8%E8%BF%87%E5%8E%BB%E7%9A%84%E6%95%B0%E6%8D%AE%E5%BA%93%E6%80%A7%E8%83%BD%E9%97%AE%E9%A2%98
--end--
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30633755/viewspace-2127736/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 資料庫Server效能問題分析案例一資料庫Server
- memlock過低導致的資料庫效能問題資料庫
- Oracle技術支援是如何分析資料庫效能問題的Oracle資料庫
- 某次資料庫效能監控中發現的問題資料庫
- 如何透過dba_hist_active_sess_history分析歷史資料庫效能問題資料庫
- SQL SERVER資料庫datediff函式引發的效能問題SQLServer資料庫函式
- Django ORM 引發的資料庫 N+1 效能問題DjangoORM資料庫
- 【DBA】如何通過dba_hist_active_sess_history分析資料庫歷史效能問題資料庫
- 資料庫效能問題解決過程1例子資料庫
- openGauss資料庫分析問題資料庫
- 資料庫索引分裂 問題分析資料庫索引
- 資料庫系列:巨量資料表的分頁效能問題資料庫
- 【TRACE】如果通過10046跟蹤資料庫效能問題資料庫
- 資料庫併發問題資料庫
- Oracle資料庫導致效能問題的可能原因Oracle資料庫
- MongoDB資料庫效能分析MongoDB資料庫
- 資料庫突然當機的問題及分析資料庫
- 深度分析資料庫的熱點塊問題資料庫
- 求助:資料庫併發訪問問題資料庫
- 使用awr來診斷資料庫效能問題資料庫
- 記憶體洩漏引起的 資料庫效能問題記憶體資料庫
- 效能優化是資料庫應用的核心問題優化資料庫
- 深度分析資料庫的熱點塊問題(轉)資料庫
- 一次資料庫當機問題的分析資料庫
- 深度分析資料庫的熱點塊問題 (zt)資料庫
- 幾種主要的oracle資料庫問題發生後資料恢復的成功概率分析Oracle資料庫資料恢復
- 併發查詢資料庫問題資料庫
- iOS開發筆記— 資料庫、Crash、記憶體問題分析iOS筆記資料庫記憶體
- 一次OWB資料庫效能問題處理資料庫
- 資料庫統計資訊不更新導致的效能問題資料庫
- 【轉載】[效能分析]Oracle資料庫效能模型Oracle資料庫模型
- SQL Server資料庫記憶體增加的問題分析SQLServer資料庫記憶體
- jboss訪問資料庫的問題資料庫
- 聊聊國產資料庫遷移中的表連線效能問題資料庫
- 【原創】由隱式轉換引起的資料庫效能問題資料庫
- Oracle效能最佳化:資料庫配置和IO問題Oracle資料庫
- 一次IO效能問題的發現過程
- 從業務角度分析奇怪的資料庫高負載問題資料庫負載