eagle-对于troubleshooting的一点体会

来源:互联网 发布:网络电视怎么用机顶盒 编辑:程序博客网 时间:2024/04/28 15:23

在公司里一直做一些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