2011年12月23日 星期五

每日一技 我成长之路


http://blog.oraclefans.cn/baishan1/entry/dba%E6%97%A5%E8%AE%B0_%E5%89%8D%E8%A8%80%E4%B9%8B%E6%88%91%E7%9A%84%E6%88%90%E9%95%BF%E4%B9%8B%E8%B7%AF

0.1.1. 每日一技 我成长之路

每日一技将是DBA日记第一部中的重头戏,在日记之后会将和日记相关的技术问题进行一个较为深入的讨论,以便于读者更好的掌握工作方法与相关技术。

作为一个DBA在其成长过程中,所需要学习的不仅仅是技术,现在介绍ORACLE技术的书籍已经相当多了,通过对这些书籍的阅读,DBA应该能够学到足够的专业知识了。不过大家可能都有这样的感觉,刚开始学oracle的时候觉得OCP是一道十分高的门槛,总觉得不知道自己需要花上多少时间才能达到那个境界。而事实上,真正想要去考OCP认证,花上半年到一年的时间也就足够了。而通过OCP认证考试后,自己还是感觉到心里空空的,碰到问题还是找不到解决的方法。

实际上如果真正的认真学习了ocp的课程,了解了oracle的一些基本原理,通过OCP考试后,理论上已经具有了相当的基础了,只是oracle DBA工作不是考试,OCP的理论也只是一个初级的理论,如何将这些理论知识融会贯通,实际应用到日常的工作中去,是十分关键的,这一点也就是我们常说的工作方法。作为一个DBA,除了学习理论知识外,学习工作方法也是十分关键的。因为DBA是一个职业,而不是一门课程,理论知识只是基础,只有理论基础是远远不够的。我碰到过很多正在学习ORACLE的朋友,他们很容易走入两个极端,一种是仅仅注重理论,看了很多书,但是总是感觉看书的时候好像什么都懂了,一放下书就觉得好像什么都没学到,真正碰到问题的时候还是两眼一抹黑;另外一种是另外一个极端,觉得读书太枯燥,总是喜欢自己摸索,他们哪怕碰到一点点小问题,都会去寻求其他人的帮助,而不愿意自己去书本里学习。实际上,一个DBA成长的过程中,需要读书和实践有机的结合,读书固然很重要,不过没有实践操作,书中学到的知识无法巩固下来。

不过并不是每个人都有条件能够参加各种实践活动的,特别是刚刚入门的DBA,他们往往缺少大型项目和大型数据库维护的经验,这对于他们在技术上的提高是很不利的,这个时候,其他人的经验就是很好的教材。DBA日记的目的是把我这些年在DBA工作中碰到的一些典型的案例,用一种很轻松的方式说出来,让大家在看这些案例的时候学习到分析问题的方法,如果看DBA日记的时候,仅仅去关注那些技术性的东西,那就本末倒置了,DBA日记的真正精华是那些象流水账似的东西。所以大家不要把DBA日记当做一本技术宝典来使用,DBA日记里涉及的技术都是大家在其他地方能够学习到的,所以DBA日记也不会大篇幅的去介绍这些技术。大家更应该看到的是老白在碰到各种问题的时候,是如何处理的,是如何把一些很基本的技术运用到这些项目中去的。

DBA日记已经在我的博客上连载了大半年了,在这期间,有些朋友在其中看到了一些共鸣性的东西,有些朋友说看不太懂,有些朋友说深有启发。那些感到共鸣的人大概从事DBA工作已经有一段时间了,确实DBA日记是比较真实的,虽然也有一些艺术的夸大,但是其基础是真实可信的。

那些感到看不懂的朋友,还是没有理解我的意思,实际上DBA日记里面就像流水账一样记录了一些DBA日常的工作。所以你觉得看不懂的时候,可能是你还没有碰到过那种情况,你不需要理解其中的每个技术细节,看不懂的地方完全可以跳过,这并不妨碍你看其他的章节(当然在DBA日记中有些问题的处理过程写的过于简化,不利于读者看懂,因此在修订DBA日记的时候,老白已经将这些案例的处理过程细化)。另外对于刚刚入门的DBA来说,这本书的第一部从一个优化的案例入手,可能确实会感觉有点不容易摸到头脑,不过不要紧,你完全可以把这本书当做一本写的比较烂的小说来看,跳过那些生涩的技术描述,提前体会一下一个DBA做优化项目的时候会遇到些什么问题,并且如何面对这些问题。只要你理解了DBA分析问题的思路与方法,这本书对于你来说就是值得的了。

那些感觉深有启发的人,应该是刚刚进入DBA行业几年的年轻人。这本书中的很多技术都是这些DBA目前正在接触和使用的。而他们又往往缺乏接触大型优化项目的机会,这本书可以作为一本不错的教材。前几天有个网友问我,他正准备接手一个优化项目,能不能给他介绍一下优化项目该怎么做。我推荐他到我的博客上去看看DBA日记。DBA日记只是一本书而已,也许和你以前看到的Oracle的书有点不同,不过书仅仅就是书,如果你认为看过一本书就能成为高手,那就错了。

每个DBA的成长之路是完全不同的,我可以把我如何学习oracle的告诉大家,给大家一个参考。我开始接触Oracle的时候,在国内接触Oracle的人还是少数。当时唯一能够找到的Oracle的资料除了Oracle的随机文档外,就只有太极出的那套VAX技术书籍里寥寥可数的几个薄薄的小册子了。刚开始的时候仅仅是安装Oracle,最早是OPENVMS平台,后来逐渐转移到UNIX平台,SCO UNIX,DIGITAL UNIX,IRIX,SUN OS,...。Oracle 5、6在性能优化上没有什么可做的,主要是针对SQL进行优化,维护管理也较为简单,主要是表空间管理。那时候的系统也比较小,一般都在几百M到几个G之间,所以也很少能够碰到ORACLE 的BUG。不过在这段时间里,有较多的机会接触小型机、网络、操作系统和应用开发,这些经历都让我在今后的DBA生涯受益匪浅。随着DBA工作做的越来越专一,接触数据库以外的工作就越来越少,到目前为止,可能除了数据库以外,其他的技术都基本上都是停留在理论上了。在做DBA初期,多接触一下其他的技术,是十分好的,随着时间的推移,年龄的增长,学习能力和学习新东西的速度都会有不小的下降。

特别值得一提的是,应用软件开发方面的经验对我的DBA工作帮助良多。DBA是在和系统和应用打交道,而不是仅仅和数据库打交道,因此应用软件开发、应用软件体系架构方面的经验和知识是必不可少的。在成为一个完全的DBA之前,我曾经是一个系统架构师,设计过大量的应用软件,因此在分析一个系统的时候,我往往能够从开发者的角度去考虑问题,在处理问题的时候就比较能够抓住关键,提出的建议也能够切合实际。我经常看到一些DBA给系统提出的建议,从oracle数据库的理论上来看这些建议没有问题,不过作为一个系统来说,这些建议的针对性不强,可操作性就很低了,这种建议哪怕提出的再多,再深刻,包含的技术含量再高,也是没有多大价值的。

在刚刚进入DBA这个行业,特别是刚刚工作的时候,应该多接触一些应用开发、系统体系架构、IT架构方面和硬件的知识。这些知识的学习不能停留在表面上,而应该较为深入的去了解。做过系统工程师或软件工程师的DBA往往更容易成功。最理想的状态是在做DBA之前做过1、2年开发,还从事过个把年的硬件工程师。实际上在DBA的工作中,不断的要面对应用软件和系统硬件方面的问题,在实际工作中,也会不断的学习这些方面的知识。如果你并没有象我说的那样在DBA这个职业之前从事过软件开发或者硬件维护的工作,那也没有什么关系,在DBA工作中,尽可能多的去学习这方面的知识就行了。

在92年到98年这几年里,我逐渐从安装Oracle转向在oracle上做各种应用软件,在使用过程中也经常对数据库进行简单的性能分析和优化。在那段时间里,Oracle相关的书籍也逐渐多了起来,通过阅读,对Oracle的一些基础知识有了一个整体的认识。在性能分析方面,学会了使用bstat/estat工具,这个工具就是现在著名的STATSPACK工具的前身,在Oracle 7上,可以使用这个工具来进行OWI的分析。不过那段时间里,对于oracle的知识的学习还不是很系统的,主要是在工作中遇到什么问题,就去学习什么知识。99年的时候一个偶然的机会读了一下oracle concepts,感觉这本书对我的帮助很大,很多以前工作中碰到的疑点都在这本书里找到了答案,所以我会给每个Oracle入门者推荐这本书,认真读几遍oracle concepts,比学习一些独门秘籍要有用的多。

99年的时候由于要给几个客户做一些维护工作,对Oracle的知识做了一些梳理,梳理的过程中也阅读了一些oracle的书籍,这个期间最大的发现是METALINK,由于给客户做相关的服务,从客户那里拿到了 METALINK账号,从那时开始,我发现以前想从书籍上获取的知识绝大多数都能够在METALINK上获取。通过对ORACLE概念的阅读,我已经基本上掌握了Oracle的基本概念和体系,知道了SGA,PGA,UGA等基本的概念,但是这些概念在我的脑子里还是凌乱的,不成体系的,粗浅的。这些概念对于我做一些复杂的分析,帮助不大,我需要更加深入的理解这些概念。在99年到2000年这段时间里,由于客户的水平和维护需求也相对较低,所以虽然我在协助客户进行数据库维护,实际上,大多数工作是较为初级的工作。这段时间里我花了大量的精力在METALINK上阅读技术文档,这个时侯的主要学习任务是扩大知识面,Oracle是十分庞大的体系,其广度十分大,如果要掌握Oracle的一些基本技术,必须花费足够的时间。在这之前,我的Oracle知识主要集中在和应用软件相关的方面,通过这段时间知识面的扩展,一些oracle的主流技术、工具基本上都有了一个初步的认识。这段时间的学习,对于主业是系统架构设计的我来说,也是帮助十分大的,因为这段时间里我面对的主要系统还是使用Oracle。由于对Oracle数据库了解的深入,在我进行系统设计的时候,就不自觉的从Oracle的角度去考虑应用软件,使应用软件能够更加适合Oracle,更多的利用Oracle的新技术。

2000年开始,我突然想写一本书,书名叫《Oracle深度历险》,这本书包括第一章 Oracle基础知识,第二章 SQL与Oracle数据库编程,第三章 深入了解Oracle数据库 ,第四章 OEM与其他Oracle第三方工具,第五章 备份恢复与容灾,第六章 Oracle数据库性能优化。为了编写这本书,从2000年到2003年,我阅读了大量的Oracle数据库方面的技术资料和书籍。其中第三章的内容是介绍Oracle基本原理的,因此我查找了数百篇关于Oracle内部原理的技术资料,其中大多数来自于METALINK,在收集资料的过程中,我也得到了美国和澳洲Oracle公司朋友的大力协助,获得了大量的INTERNAL ONLY的文档,这些文档对于我理解Oracle的内部原理帮助十分大,这些文档我已经陆续发布在Oracle粉丝网(http://www.oraclefans.cn)上了。《Oracle深度历险》的编写工作历时3年,不过2004年我第二次修改这本书的时候,我决定放弃这本书,因为那时候Oracle的技术书籍已经相当丰富了,《oracle深度历险》中的绝大部分内容都已经有了,再出版这样一本书没有任何意义。虽然《Oracle深度历险》夭折了,不过写书的目标让我在2、3年时间里,对Oracle重新梳理了一遍,对Oracle的认识更加深入了。在写书的过程中,对于每个知识点,如果能够进行实际操作的,我必须亲自操作一遍,确定没问题,才会写入深度历险。这段时间的写作虽然没有写出一本好书,不过写书的经历对我来说是一笔十分宝贵的财富。所以我也经常建议公司的员工,不要光看书,看书的时候一定要自己亲自做一遍,然后再把做的过程写成文档,书上的东西才能真正变成自己的。其实这个过程包含了几个步骤,第一个步骤是通过读书学到了新的知识,然后通过自己的亲自实践,将书中学到的新知识得到一个感性的体验,最后将这个体验用自己的语言描述出来,那么这个知识点就记住了。如果不这么做一下,读书的效果就要打很大的折扣了。

对于DBA来说,写博客是一个不错的主意。将自己学习的成果通过博客整理出来,既可以起到整理思路,完善知识点的掌握的作用,又可以通过博客和其他DBA进行交流,为其他正在学习中的人提供技术资料,最终达到群体学习的目的。我经常建议公司的年轻人群体学习,群体学习说起来很简单,就是如果存在一些知识点,有几个人都想去学习,如果每个人都是独立的去学习可能需要花费1、2个月的时间,如果换一种学习方法,就是几个人分分工,每个人学习一个知识点,然后通过互相交流的方式,大家互相传递知识,这种学习方法,可能可以缩短一倍的学习时间,而且学习到的知识的深度也会高于一个人自己学习。群体学习的前提条件是,一起学习的人的技术层面基本接近,而且大家都很开放,都愿意把自己的知识拿出来和大家分享。

到达一定的阶段后,很多DBA会感觉遇到了一个瓶颈。这个瓶颈我也曾遇到过。2003年到2004年这段时间里,我经常感觉到碰到了天花板的感觉,这段时间里我在经营一家软件公司,最初的时候还自己写一些代码,随着公司越来越大,最后连系统架构都交给了技术总监,从那时候开始我离开发就越来越远了,不过也有更多的时间研究Oracle相关的技术。这段时间给客户做优化的项目比较多,在做项目的时候,总是感觉很难很快的抓住问题的核心。在这段时间里,阅读了大量Oracle INTERNAL和优化相关书籍,包括《Cost Based Oracle Fundamentals》、《oracle 8i internal services for waits latches locks and memory》、《Inner look on Oracle latches》、《Oracle performance tuning & tips》、《Oracle 9i tuning guide》(oracle官方文档)、《DSI 401E》、《DSI 402E》等。实际上来说这些书籍,每一本都对我理解Oracle有很大的帮助,不过每一本都没办法解决我的所有的问题,在很多地方涉及到内部原理和算法的时候也往往都是点到即止。DSI是Oracle内部培训教材,也是广大DBA追逐的目标。认真学习一下DSI对理解Oracle内部原理是有很大帮助的,不过想理解ORACLE内部原理并不只有DSI一条路,说实在的,DSI的文档,我手头有一些,不过真正认真去看过的,也只有DSI 401E和DSI 402E这两个。现在DSI的文档在互联网上很容易下载到,系统的学习一下DSI课程对于DBA来说是个不错的选择。

除了读书外,还有很多问题是书本无法回答的,所以我也在互联网上查找更多的关于Oracle内部原理的文档,通过GOOGLE和百度去搜索更多的Oracle技术网站。http://ixora.com.au是一个相当不错的网站,上面有很多关于ORACLE INTERNAL的资料,虽然资料基本上都是基于8i的,不过资料十分权威。ASKTOM网站也是这段时间经常访问的网站,最初知道ASKTOM是通过GOOGLE搜索的时候,基本上都有链接指向ASKTOM,从ASKTOM,我学习到了TOM分析问题的思路和方法,这一点对于我今后自己处理问题是十分有帮助的。

至于国内的网站,那时候ITPUB和ORACLE.COM.CN比较热门,开始的时候也经常在这两个网站上讨论一些技术问题。随着这两个网站上一批DBA的水平越来越高,这两个网站上技术交流的质量却越来越低,在国内的网站上很难找到我所需要的资料,所以我把目标面向了英文网站。国外的ORACLE技术网站很多,不过大多数都是会员制的收费网站,少量免费网站(比如ITTOOLBOX)上面的技术水平又普遍比较低,所以找了一圈网站,最后还是觉得学习ORACLE,最好的网站还是METALINK。这段时间由于ben的帮助,获得了不少Oracle内部的技术资料,通过对这些资料的学习,很深入的了解了Oracle内部的一些算法,这些学习过程,对我突破这个瓶颈起到了很至关重要的作用。

在这个突破瓶颈的阶段,我的学习方法是对于某一个知识点,深入的研究下去,并尽可能的把相关知识点也融会贯通,特别是两个知识点的结合部。为了了解数据块的结构,我花了相当长的时间去DUMP数据块,甚至编写了一些小程序去读取数据块中的数据,这个时候,以前搞开发时候深厚的c语言功底起到了很好的作用。对于绝大多数DBA来说,完成好日常工作并不需要学习那么多内部原理性的东西,不过如果你有兴趣,并且有足够的时间,那么深入研究Oracle的内部结构和原理是十分有趣的事情。至少对于我来说是这样的,从BUG报告生涩的文字和少量的内部代码里分析Oracle内部实现的原理和看一部好的小说一样有趣。上大学的时候也刚毕业的时候喜欢看一些散文和诗歌,而现在我阅读的对象除了轻松的商业小说外,就只剩下METALINK文档了,这是一个爱好问题,已经可以说与ORACLE技术无关了。

对于绝大多数DBA来说,可能他们缺少实践的机会,这对于DBA这个职业来说是十分致命的,可能会影响到DBA的成长。我第一次做优化项目的时候,虽然说那时候我已经具备了很深的理论知识,从事Oracle维护工作也有几年时间了,不过在项目开始之初,还还是碰到了很多意想不到的困难,甚至有时候出现了方向上的偏差。这实际上和实际工作经验是息息相关的,哪怕你的理论水平再高,没有真正做过几个优化项目,是很难真正理解什么叫优化的。对于缺乏实际工作经验的DBA,在ITPUB、METALINK、OTN等论坛或者QQ群里帮助别人解决问题,是一个十分好的办法,你可能会碰到各种各样的案例,都是你目前工作环境中无法碰到的,通过接触这些实际的案例,可以弥补你在实际工作经验上的不足。从04年起,我建立了自己的ORACLE讨论群"白鳝的洞穴",在这个群里,帮助网友解决问题是一件十分有趣的事情,很多案例可能在日常的维护工作中你无法遇到,不过通过QQ群你可以接触到更多的实际案例。

当你通过了OCP甚至OCM认证考试后,你的理论知识积累已经达到了一定的程度,这个时候,如果你不能从事相应的工作,在这些工作中把你的理论知识消化,并融入你的思维当中,这些理论知识很快会在你的头脑中消失。过上1到2年,这些理论知识就会被忘的干干净净。所以说,通过认证考试不是目的,只是一个过程。当然拥有OCM证书,会给你的职场生涯带来很多好处。

理论知识的学习是十分枯燥的,很少有人原意一遍一遍的阅读ORACLE CONCEPTS,虽然这么做对你的Oracle理论知识的提升帮助很大。Oracle的知识面很广,一个人也很难有机会把所有的ORACLE知识都认真的梳理学习一遍。给别人讲课是学习理论的一个很好的途径,我有一些知识就是通过给别人培训学习的。比如说DATA GUARD,对于DATA GUARD的原理,我大体了解,这是从REDO LOG的结构方面可以推断出来的,不过具体的一些技术细节以及实现方法,就知之甚少了。有一次需要给一个客户讲DATA GUARD的课程,我花了差不多两天的时间来整理培训讲义,并且准备了一个学生实际操作用的WORKSHOP,设计了几个常见的演练场景。通过这个备课过程,对DATAGUARD的原理、配置管理和维护的基本操作就了解的十分清楚了。几年过去了,虽然DATA GUARD的技术在不断演进,我在这几年里也没有做过DATA GUARD的项目,但是通过那次讲课,DATA GUARD已经深深的融入了我的血液里,再也不会忘记了。随着数据库新版本的推出,GATA GUARD技术在不断的演进,不过其主体技术是不会发生大的变化的,因此这些知识,在有了一定基础后,只需要你在使用前再去RENEW一遍就足够了,不需要花更多的精力去更新。

有些知识点,平时可能不会注意,不过如果你要给别人讲课,就需要你真正认认真真的把这些知识点一个一个搞清楚,因为没有一个老师原意在课堂上被学生们问的哑口无言。记得刚刚工作的时候,公司派我给一个客户讲RDB数据库,在这之前我连RDB数据库是什么样都不知道,那时候在DEC公司,老板是香港人,给我留下一本讲义一本RDB的REFERENCE,给了我3天的时间准备。那是一个十分艰苦的任务,我给客户讲了近10天的RDB课程,每天晚上我通过阅读讲义和参考手册备课,对于讲义上的每个WORK SHOP都要首先做一遍,第二天再教给学员们。10天的课程终于讲完了,没有一个学员看出我也是第一次学习RDB。通过那次讲课,我对RDB数据库的了解比公司里其他员工都要深。10多年后的一天在一个客户那里,听说他们有一个RDB数据库里有一批很重要的数据想搞出来,不过没有人懂,所以只能通过应用程序显示在终端上,然后由一个人一点一点的抄下来。我听说后凭着那次讲课留下的对RDB的印象,居然帮用户把数据导成文本格式,然后通过SQL LOADER装载到了ORACLE数据库里。

最后要说的是,DBA是一个工作,一个还算不错的工作,但是并不是每个人都需要把DBA当做一种生活。因此对于技术的追求并不是每个人的生活目标,如果你喜欢ORACLE,那你不妨把阅读枯燥的理论知识和越多干涩的TRACE文件当成一种乐趣,否则,就把它当成一种工作,一种生活中的点缀吧。

沒有留言:

張貼留言