我的Oracle之路

gugu99發表於2007-11-30
我的Oracle之路

大學的時候,我是管理學院的,後來細分專業的時候選擇了資訊管理。於是管理、會計、財務、機械、電子,
甚至說情報檢索都學過,當然也包括計算機。

如果不算foxbase和foxpro的話,資料庫方面僅僅學過一門資料庫原理,用的教材是Stanford的影印版。
當時有一個韋老師,總是吹她老公是MIT的博士,很NB。總是對我們說,要有自信,要敢於嘗試留學一類的東西,
選用這個教材好像就是她推薦的。
後來實行導師制度,帶我們的是兩個博士生,馬輝民和程海芳老師。跟著他們做實習,用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都是很多年來一點一點實現和挖掘出來的,一邊抽象、一邊挖掘)。做好茶葉蛋也需要很多工夫細微觀察和總結的,也可以發財的。不知道這個算不算提升。

大繁至簡,很多不同的領域也許是有相通之處的,也許可以簡單用幾句話來表達出來。雖然我有些關於方法方面的觀點沒有說,看過這篇文章,也許每個都有自己的觀點,每個人經歷不同,感受和體會就不同。


附:

我做的東西比較雜,也不是專業的DBA,看過的軟體工程、SCM、OO理論方面的書也許Oracle都要多,但是Oracle給我影響始終是最大的。所以想發表一下自己的看法。
寫一篇文章並進行潤色,是件很費精力的事情。上面這篇文章,我一遍寫成的,甚至沒有閱讀第二篇,有可能有不精確的地方。當作獻醜,也當作貢獻。給大家看一看。
就我自己來講,好幾年來,每次回望以前,都有感於自己的無知,再過一段時間進行回望,就會有感於上一次的無知。
[@more@]

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10748419/viewspace-986905/,如需轉載,請註明出處,否則將追究法律責任。

相關文章