做Oracle的和作茶叶蛋的没有本质的区别
大学的时候,我是管理学院的,后来细分专业的时候选择了信息管理。于是管理、会计、财务、机械、电子,甚至说情报检索都学过,当然也包括计算机。
如果不算foxbase和foxpro的话,数据库方面仅仅学过一门数据库原理,用的教材是Stanford的影印版。
后来实行导师制度,带我们的是两个博士生,跟着他们做实习,用pb 6.0连上oracle 7.3创建了一些表和视图,写了一些power script。其实也知道做的不太好,老师表扬我做的还不错,于是对这个刚来上课时还会脸红,到后来却带着墨镜在校园里伴酷的MM,多少多少有了点好感。
找工作的时候,大家都说用过的叫作熟悉,听说过的叫作了解。也不好意思写了解,于是简历上写了熟悉Oracle。工作以后做Project和SQL Server方面的东西,后来在深圳银河培训SQL Server的时候,老师说SQL Server很简单,Oracle才是博大精深。对Oracle开始有点好奇。
不久以后换了工作,开始使用Oracle数据库,主要是做报表视图、写PL/SQL程序、数据库建模,知道了很多小技巧,如表按什么顺序连接,什么时候要用索引,什么不应该用索引,怎样避免死锁。印象中书看的最多的就是机械工业出版社那套Oracle8丛书中的Oracle初学者指南,PL/SQL程序设计指南,PL/SQL高级程序设计指南。也隐隐约约知道Oracle中有个SGA,有个叫做池子的东西。并在Linux上自豪的装上了Oracle 815,不到一年的时间很快过去了。
第二年开始迷恋上了Oracle的结构,SGA,知道了什么叫做DB Buffer,什么叫做Log Buffer,如何分配,很笼统的概念:“DB Buffer一般要给SGA的80%左右”,知道了高速缓存率等等多概念,还知道了控制文件很重要,有人问我假如控制文件全部丢失了,只有数据文件和日志文件,能不能恢复,我不是很确定的说不能吧,结果对方很轻蔑地对待自己,话语至今还记忆尤新。
于是在那个夏天,我知道了scn,大致明白了备份与恢复的原理,知道了如何创建控制文件,什么时候用resetlogs,什么时候用noresetlogs,但是为什么不知道。接着知道了DBWR,LGWR,CPKT等等的作用,还看了"oracle8i internal services for waits, latches, locks"那本书,明白latch,lock,semphore的各种类型和确切用途。知道了free list,pct free,大致明白了Db buffer、Log Buffer,Large Pool,Share Pool这些东西该怎么去配置,更知道了用Unix里面的top,vmstat,sar来监控性能,印象最深的就是ITPUB上面当时的几位高手知道lular2000对泰国一个关于智能网的数据库如何配置。并Ixora网站的文章制作成电子书在ITPUB上。
也开始看高性能SQL调整内幕,知道了Neeted loops,Merge join,Hash join,也知道了Unique scan,fast full scan,index skip scan,full scan这些名词和作用,也知道了如何根据执行计划调整SQL语句,知道了如何跟踪调优。并带着两个同事负责这边系统包括Oracle在内的程序改进和维护工作。于是开始以为过去很苯,什么都不懂。现在是高手了,一定要做一个Oracle优化软件。很多书我都扔掉了,当时买的Oracle性能优化内幕(Oracle Performance 101)现在还保留在身边。
结果下一年春天的时候,发现写一个Oracle优化软件的难度很大,根本做不来。只是隐隐约约的构想整个Oracle的运行情况,是懂非懂。但是觉得对搞应用来讲足够了。
其实我也一直关注Java和OO的东西。接下来因为工作上的原因,很少关注Oracle,即使关注也是看文章和思索层次(唯一有点相关的是关注到了主机和存储方面的东西,还琢磨过hp和IBM的宣传手册)。全心做Java和OO的东西。
有一天明白了事务的acid属性,明白了分布式事务,事务是怎么实现的,才算明白为什么Oracle的每一部分为什么要那样设计。从此以后我觉得豁然开朗,提升了一个档次,知道了结构上Oracle为什么会这样设计,直到现在的RAC,各种备份方法。看了JBoss的Marc Fleury的blue自传,他说"cache is the king",尽管以前都说缓存可以提高性能,Marc的话才让我明白了为什么,知道了CPU,CPU cache,Memory,Disk,Network之间的关系,每一层何尝不是下一层的缓存。
就这样,我清楚DBWR,LGWR,CPKT,semphare,Latch,DB BUFFER、Log Buffer、log file、data file、Control file、lock是如何精确协作的,block里面是什么结构,事务如何实现,各种等待事件什么会发生。
结果直到去年8月的一天,突然要和公司的同事一起去为一家单位做异地容灾方案,各种原理我都清楚,只是用的oracle 8.0.5和HP-UX 11i的组合,硬件是吓人的hp superdome。oracle 8.0.5版本我没有用过,虽然整个过程很顺利,我还以为oracle 8.0.5还要用x window来图形安装,像个笑话。开始苦苦实践,身经百战才能够所向披靡。
接着我像很多人一样,分析了Oracle物理实现方面的问题,特别是control file,data file,log file,各种文件的结构和关系,加上原来的不少经验,备份与恢复方面的各个概念和内容、为什么要这样做,很easy。这是我的又一次提升。
更接着我从Oracle体会到了Hash算法、B+树、List的作用和实现,如何实现高速查找的,虽然书本上早就看过。这个时候我也明白了Oracle是如何解析和执行SQL语句的,于是虽然我还看执行计划,还看执行计划所化的IO代价和CPU代价,但是和过去的感觉已经不可同日而语了,这又是一次提升。
又是在去年那段时间,我看了scaling oracle 8i这本书,明白了硬件结构上很多东西,加上这两天明白了Linux内核是如何实现的,特别是如何调度进程、如何实现semphare,latch,lock、如何测量CPU和IO性能。以前所不能够理解的东西,如java和weblogic调优方面,一下子明白了很多,我觉得这是我从事IT行业技术上的最大提升。
这段时间我一直在想,Oracle就像一个公司(说国家这句话可能有点大了)一样,你要规划公司的运作和发展方向,你要预防不可预料的事情发生,你要评估公司的运作效率,改进公司的工作流程和方法。持续改进,才是适应形势的发展。但是你永远也不可作最精确的评估公司的运行效率(也没有意义),假如公司被整理井井有条,做什么事都是严格按照所谓科学的东西来做,那么公司很可能就会出问题,有时候出点乱子才是活力的象征。Oracle何尝不是如此。运作一件事情其实也是工程,很多东西需要平衡和折衷。
更有一个滑稽的念头冒了出来,做Oracle的,和作茶叶蛋的,其实也没有本质的区别。只不过做Oracle的门槛高了一点而已。都是在前人和自己经验的基础上,进行不断升华和总结(参考Oracle公司发展史,今天我们以为很基本的功能如事务、表锁定、行锁定直到ops,rac,data guard都是很多年来一点一点实现和挖掘出来的,一边抽象、一边挖掘)。做好茶叶蛋也需要很多工夫细微观察和总结的,也可以发财的。不知道这个算不算提升。
大繁至简,很多不同的领域也许是有相通之处的,也许可以简单用几句话来表达出来。虽然我有些关于方法方面的观点没有说,看过这篇文章,也许每个都有自己的观点,每个人经历不同,感受和体会就不同。