第1步 明確問題
對問題需要做到4W(What:現象、When:時間、Where:范圍 、Who:影響)
好的開始便是成功的一半,通過理清這些問題,部分問題原因和答案可能會已經躍然紙上了。
第2步 分析和診斷
分析和診斷性能問題包括一系列的行動計划,數據和信息收集,分析和調查。
新手處理思路:新手一般面對問題,開始收集各種信息資料,嘗試各種方法,甚至在一個處理思路上鑽牛角尖,從而不利於問題解決。
高手處理思路:在確認和理清問題后,會提出相對靠譜的處理方案或指明問題處理方向(同樣也是需要資深專家的經驗支撐)。
問題的處理能力:對於(數據庫性能問題)診斷的處理能力,可以總結幾個方面:
1、知識架構的系統性(廣度)。
2、某一領域知識點的理解程度(深度)。
3、經驗和時間積累的問題敏感度。
知識不等同於信息,只有將信息經過思考和處理才能將信息轉變成自己的知識。
對於知識的系統性即廣度而言,需要在系統的學習,讀書,參加培訓過程中,具有開放的綠燈思維,保持各種新事物的好奇心,對接觸到的信息內容不斷整理和拓展;
對於知識的理解即深度而言,則需要在知識的重復性學習和解決問題的過程中,不斷自己動手測試驗偽,追溯本源回歸原理;
對於問題的敏感度,則是一種綜合能力,需要在前兩點的基礎上,通過經驗積累和有意識地磨煉。
思考方法:
作為一般的思考方法,可以通過有效的聯想,基於基本原理和特定場景,深入本質,找出已知信息和未知變量之間的聯系;
如果不能找到直接的關系,再進行聯想,普遍化或特殊化相關類似問題,保留一部分已知信息再進行抽象的摸索,找到思路,適當的休息,讓右腦工作也能起到意想不到的效果。
然后可以通過規范的流程,對已確定的內容回顧和重新整理思路,縮小問題范圍,找到突破點,並找到最終的原因。
數據庫性能診斷清單:
對於數據庫性能問題,我們通常采取自上而下的方法進行診斷,
1、80%以上的問題是由於應用導致的,所以在遇到數據庫性能問題時,首先要從應用程序和應用狀況入手,看看發生問題時或之前,
是否有相關的應用或設置變更等,
對於數據庫來說比如參數修改,表或索引的變更,大量的修改刪除或錯誤的應用導致的連接風暴等。
2、對於一台服務器而言,包括硬件和軟件;軟件又可以細分為操作系統和操作系統上應用軟件,數據庫只是操作系統上應用軟件的一個應用軟件而已。 當操作系統整體較慢時,作為應用軟件的數據庫自然也會受到影響,成為被害者而性能低下。
所以,當我們遇到服務器的CPU/內存/I/O等資源的使用率較高時,首先要通過OSWatcher或TOP等OS命令弄清楚到底是什么應用在占用大量的CPU/內存/I/O等?這里的“罪魁禍首”可能是Oracle數據庫的操作,也可能是操作系統本身進程或者其他應用軟件(如殺毒軟件,備份軟件等)。
3、如果操作系統層面沒有問題的話,則需要看一看是整個數據庫實例慢還是掛起(Hang/Spin)狀態。 如果是數據庫實例慢,我們可以通過AWR/Statspack/ASH/動態試圖等數據庫工具來確認數據庫整體性能是否真的有問題以及進一步縮小一下問題的范圍。 需要注意的是,所謂的是否有問題的標准時相對的,要參考平時的負荷狀態以及事先建立的基線等。 如果是掛起(Hang/Spin)狀態,最好第一時間取得hanganalyze和systemstate dump信息,以便找到根本原因。
4、如果能夠找到某些特定的進程或會話占用大量DB時間,我們可以基於進程的信息來分析和診斷,看看是后台進程還是前台進程有問題, 如果是后台進程的話,可能和數據庫內部運行程序本身相關,如果前台進程則可能是用戶的應用程序有問題。
5、如果能夠定位某條SQL語句,可以確認問題在於SQL的哪個執行階段(Parse?Executing?Fetch?),執行計划是否改變?我們可能會去SQL Trace 或者Optimizer Trace進一步診斷。
分析問題是一個循環的過程:理清問題后最初的靈感開始,收集數據,確認信息,重新思考/調查,找到突破點,提出行動方案,驗證和測試,收集更多信息,重復直至最終找到問題原因。
定位原因
通過上面步驟循環,我們可能找到“我們認為”的問題原因,但由於人的思維習慣,很容易很多的“想當然”,存在認知偏差和條件反射。
所以下結論前,我們還是要重新斟酌,想想導致問題發生的數據庫運行基本原理,並結合用戶的環境,形成一個證據鏈,通過相應的事實和理由來證實,確實是我們指出的原因導致現象發生。
這其實是一個最重要的環節,就像是法官的舉證和審判。
第三步:
作為分析診斷問題三板斧的最后一板斧,則是根據原有找到最佳的解決方案。
解決方案三要素:
做什么(what),為什么(why),怎么辦(how)
做什么:就是根據上一步找到的問題原因定制解決方案,這個部分中,我們要考慮充分,盡可能的想出所有解決草案。
為什么:是論證解決方案的部分,我們要根據基本原理和經驗案例或測試來論證方案的有效性。
怎么辦:最后一步是依靠我們的專業性,提出最佳的解決方案,所謂最佳解決方案是在理解用戶業務和技術影響的基礎上,在當前情景中找到影響最小,最有效果的解決方法,另外,為了適用與不同水平的客戶和減少追加問題,我們需要給出具體的詳細的實施步驟。
注:本文摘自 oracle降龍十八掌,“書讀百遍,其義自見,書寫百遍,其義親見。”