eagle-對於troubleshooting的一點體會
在公司裡一直做一些troubleshooting的工作,經常有一些新的問題出現,其中也不乏一些比較棘手的問題。談一下自己做troubleshooting的一點體會吧,希望對大家有所協助。
首先要具備堅實的oracle基礎,對一些基本概念的掌握要有深入的理解。我建議一開始看書就以英文書為主,以一些中文原創的文章書籍為輔,中文翻譯的最好不要看。也許你的英文基礎不好,一開始看的時候會很吃力,不過時間長了你就會體會到當初堅持讀英文書是多麼明智的選擇。我周圍的DBA都是在讀英文的書籍,現在看中文翻譯的書籍真的是看不懂,不知道他在說什麼,相反看英文的看起來很流利。如果你想做一名優秀的DBA,一定要看英文的書籍。很多人也推薦了很多書給大家,我這裡說說我推薦列表吧。首先是官方文檔中的《concept》, 《administrator’s guide》和《performance tuning》三本書,官方文檔都可以在otn.oracle.com上下載到。如果你對大塊頭的英文書很懼怕,可以先從OCP的書看起,然後再來看這三本書。很多人都知道這三本書好,但是真正堅持看完的不多,真正理解的更少。如果你看懂了,那麼恭喜你,你水平已經不錯了。其他的好書很多,我推薦幾本書。
首先是Jonathan Lewis的兩本書《practical oracle 8i》(這本書我沒有看到過電子版,如果誰有請告訴大家)和《 Cost Based Oracle Fundamentals》。Jonathan Lewis一直是我認為現在的oracle屆第一牛人,他的這兩本書都很經典。很期待他的另外兩本CBO的書。
Steve Adams的名著《oracle8i.internal.services.for.waits.latches.locks》,好像是Steve Adams的唯一一本書。這本書很薄,但言簡意賅,多看看很受益。
K Gopalakrishnan的《Oracle.Wait.Interface.A.Practical.Guide.to.Performance.Diagnostics.and.Tuning》
這本書也可以在itpub上下載到,是一本很實用的書,對oracle的一些常見的wait event做了很好的解釋。做troubleshooting必讀。
讀書時力求理解透徹,不要一味追求進度。
這一階段就是要多看書,多思考。
第二步,有了紮實的基本功,就要加強實踐了。這時候需要做大量的事情來強化基礎知識。看過的東西長時間不用的話,很快就容易忘記了,只有在實踐中不斷的運用,才能夠深入的理解。這一階段對工作環境有一定的要求,如果你現在的工作環境強度不夠大,工作量不夠多,建議你可以考慮換一份工作了。只要你第一階段基本功打得好,不愁找不到合適的環境。其實各大公司的一些面試題都是在考察的基本功底。在做事的過程中不能盲目的做,要帶著思考的去做事情。不要小看一些簡單的事情,例如add column, create/drop table, insert/delete/update等,其實現在DBA常做的90%以上的都是簡單的事情,但是能把簡單的事情做好,做很多事情而不出錯是很難的。你要考慮做這件事情會有什麼影響,會有可能遇到哪些問題,出了問題後如何解決,如何去rollback,這些都是在你開始做之前就要想清楚的,而不是要等到出了問題以後才開始考慮。
網上有人犯一些很低級的錯誤,不要小看這些錯誤,不要以“我不是不懂,只是不小心”為借口來幫自己推脫。我網站的副標題是“We are what we repeatedly do. Excellence, then, is not an act, but a habit.”這句話我一開始是在公司的outage plan上看到的,亞裡士多德的一句名言,覺得說的很好。人是由習慣組成的,人一天做的絕大部分事情是在重複自己的習慣,習慣也是最難養成的。而DBA必須養成細心的習慣,這個習慣比你多瞭解一些知識還要重要。另外對於一些知識的掌握,我覺得要以實用為主,太注重一些與實際應用沒有關係的internal的東西沒太大的意義。有人對在production系統上線上create/rebuild index後要加online不清楚,卻對delay block cleanout說的頭頭是道。我不是說研究internal不好,但是要分清主次,以實用為主。這一點上很佩服Jonathan Lewis,他internal的知識很強的(在Steve Adams的書裡提到過),但是他的文章都是以實用為主,不實用的東西他很少發布出來。
除了對習慣的養成,這一階段還要注意對一些細節的搜集。Oracle管理上有很多零散的知識,而這些零散的知識大多是在不斷的大量的高強度的實踐中學到的。
這一階段就是要多做事,少犯錯。
說了上面兩點,其實都是預備知識,下面開始說troubleshooting的一點體會。
1. 不要忽略任何一個細節資訊。在問題出現的時候會有多種現象一起出現,例如active session很多,enqueue很多,latch free很多等等。如果你給出的解釋不能夠解釋每一個現象,不能覆蓋每一個小細節的話,很有可能你的解釋是錯誤的,需要推翻後重新推理。看過柯南或金田一動畫的都知道,如果有一個問題沒有搞通為什麼的話,是不能做出最後的結論的。
2. 要充滿想像力。對於簡單的問題可能一眼就可以看出原因,而對於一些複雜的問題比較困難。很多現象混雜在一起,很難分清楚哪個是起因,哪個是結果。這時候就要大膽的想像,將所有的現象結合在一起,思考出一個合理的解釋。要善於挑戰自己已有的知識,可能你的知識因為資料庫版本的變化,或者oracle的一些bug在處理一些問題時已經不合適了。這時候不能固執的堅守自己的知識,要善於推翻自己,螺旋式的上升。
3. 推理要嚴謹。就是要講證據,不能單靠想像來解決問題。如果你的解釋是正確的,要找到證據來支援你的解釋。通過一些其他現象的挖掘或者通過一些後續的實驗來證明你的解釋。對於一些bug,一定要找到相應的文檔或者開tar得到oracle的確認,不能遇到一些奇怪的問題就說是oracle的bug。Oracle的bug是不少,不過也許你遇到的並不是bug,可能是知識上的缺失。
4. 深入的思考。有些問題在剛開始覺得難以想像,但是當你再深入一個層面後覺得原來所有的現象都是可以被完美解釋的。這一點我在平時troubleshoot的過程中感觸很深。以後有時間可以舉例來說明。
5 解決方案要抓住重點。找到了根本問題後,解決方案就比較容易一點了。主要是基本功要紮實,一定要抓住重點。
切忌兩點:
切忌概念不清
基本概念一定要清楚,例如PCTFREE, PCTUSED和 LMT,DMT沒有關係。”cache buffer chain”和”buffer busy wait”是兩種完全不同的等待事件,對select指定一個大的復原段對ora-01555沒有任何協助,等等。
切忌生搬硬套,不要到網上找一個別人的例子往自己身上硬套。一定要徹底的理解問題發生的前因後果,才能夠做出正確的判斷,別人的例子只可以用來參考。
最後做個小廣告:如果你覺得你的基本功紮實,但是缺少一個合適的環境的話,歡迎加入我們。我們的系統很繁忙,事情很多,挑戰也很多。
有意可以發email給我: xfan (at) ebay.com