由于Oracle運(yùn)維管理的專業(yè)性門檻較高,導(dǎo)致Oracle運(yùn)維管理成本增加。在這種情況下,如何深入掌握Oracle,如何提高數(shù)據(jù)庫運(yùn)維效率成為許多數(shù)據(jù)庫管理者的困擾。盡管國內(nèi)有關(guān)Oracle方面的書籍繁多,但卻沒有一本真正意義上介紹Oracle數(shù)據(jù)庫運(yùn)維自動(dòng)化的書。本書從與Oracle緊密相關(guān)的操作系統(tǒng)層面入手,將操作系統(tǒng)架構(gòu)與Oracle體系有機(jī)整合,以逐步深入的方式將Oracle基礎(chǔ)理論運(yùn)用到實(shí)際操作中,引導(dǎo)讀者在面對故障時(shí)找到處理問題的正確方法。同時(shí),結(jié)合開放式可擴(kuò)展的自動(dòng)化運(yùn)維體系,將數(shù)據(jù)庫運(yùn)維工作按需自動(dòng)化,在保障數(shù)據(jù)庫高性能運(yùn)行的同時(shí),大大提高了數(shù)據(jù)庫運(yùn)維工作的效率。
為什么要寫這本書2008年的某一天,我懷著激動(dòng)的心情參加了支付寶公司的面試,這次面試讓我對國內(nèi)最前沿的數(shù)據(jù)庫自動(dòng)化運(yùn)維技術(shù)有了初步的認(rèn)識,對我的職業(yè)生涯影響非常大,時(shí)刻激勵(lì)著我以后不管遇到什么困難或者誘惑,Oracle始終都是我追逐的愛好和目標(biāo)。
在接下來幾年的工作中,我較為深入地研究了C語言數(shù)據(jù)結(jié)構(gòu)、Linux操作系統(tǒng)原理以及Shell(PHP/Java)編程等知識,這些技術(shù)能夠很好地支撐Oracle運(yùn)維管理。同時(shí),多年的經(jīng)驗(yàn)告訴我,對集運(yùn)維與開發(fā)于一體的Oracle運(yùn)維管理體系來而言,精通一門開發(fā)語言是相當(dāng)有必要的,因?yàn)橹挥羞@樣才可以更為深入地了解數(shù)據(jù)庫與業(yè)務(wù)程序之間的架構(gòu)設(shè)計(jì),并能夠更為精確地把控Oracle管理優(yōu)化,從而在面對各種疑難問題時(shí)找到解決的突破口。
2014年,我有幸與來自支付寶開發(fā)團(tuán)隊(duì)和淘寶運(yùn)維團(tuán)隊(duì)的伙伴共事,學(xué)習(xí)交流了來自阿里的系統(tǒng)架構(gòu)設(shè)計(jì)及運(yùn)維管理理念,這使我編寫自動(dòng)化數(shù)據(jù)庫運(yùn)維書籍的想法更加強(qiáng)烈,并希望通過書籍與大家分享自己多年的工作經(jīng)驗(yàn)。
本書主要特色由于Oracle運(yùn)維管理的專業(yè)性門檻較高,導(dǎo)致Oracle運(yùn)維管理成本增加。在這種情況下,如何深入掌握Oracle,如何提高數(shù)據(jù)庫運(yùn)維效率成為許多數(shù)據(jù)庫管理者的困擾。盡管國內(nèi)有關(guān)Oracle方面的書籍繁多,但卻沒有一本真正意義上介紹Oracle數(shù)據(jù)庫運(yùn)維自動(dòng)化的書。本書從與Oracle緊密相關(guān)的操作系統(tǒng)層面入手,將操作系統(tǒng)架構(gòu)與Oracle體系有機(jī)整合,以逐步深入的方式將Oracle基礎(chǔ)理論運(yùn)用到實(shí)際操作中,引導(dǎo)讀者在面對故障時(shí)找到處理問題的正確方法。同時(shí),結(jié)合開放式可擴(kuò)展的自動(dòng)化運(yùn)維體系,將數(shù)據(jù)庫運(yùn)維工作按需自動(dòng)化,在保障數(shù)據(jù)庫高性能運(yùn)行的同時(shí),大大提高了數(shù)據(jù)庫運(yùn)維工作的效率。
本書讀者對象根據(jù)本書的內(nèi)容特點(diǎn),可以將閱讀對象分為以下幾類:
Oracle數(shù)據(jù)庫管理人員;Oracle數(shù)據(jù)庫開發(fā)人員;應(yīng)用架構(gòu)師;數(shù)據(jù)庫架構(gòu)師;系統(tǒng)集成架構(gòu)師;運(yùn)維管理維護(hù)人員;數(shù)據(jù)庫技術(shù)愛好者。
如何閱讀本書閱讀本書前需要對Oracle基礎(chǔ)知識有一定的了解和掌握,只有這樣才能保證閱讀的暢通性。如果對某些知識點(diǎn)存在困惑,可以查閱Oracle在線官方文檔(http://docs.oracle.com)獲取幫助。
本書共10章,分為三篇:基礎(chǔ)篇、優(yōu)化篇、方法篇。
基礎(chǔ)篇(第1~4章)主要介紹了Linux環(huán)境下Oracle內(nèi)存體系架構(gòu)的組成和功能,同時(shí)對Oracle日志與回滾段內(nèi)容進(jìn)行了講解,在幫助讀者深入理解Oracle知識體系的同時(shí),為后續(xù)數(shù)據(jù)庫優(yōu)化及備份恢復(fù)打下基礎(chǔ)。
優(yōu)化篇(第5~6章)主要介紹了Oracle SQL優(yōu)化的原理和思想,并結(jié)合CBO優(yōu)化器對Oracle優(yōu)化進(jìn)行探索。其中,SQL優(yōu)化原理和思想是CBO優(yōu)化的基礎(chǔ),將兩者結(jié)合即可提供Oracle數(shù)據(jù)庫優(yōu)化參考。
方法篇(第7~10章)主要講解了Oracle備份恢復(fù)的原理,以及如何制訂符合自身數(shù)據(jù)庫特點(diǎn)的Oracle備份恢復(fù)計(jì)劃。同時(shí),結(jié)合自動(dòng)化運(yùn)維管理系統(tǒng)、自動(dòng)化歷史分析系統(tǒng)及自動(dòng)化實(shí)時(shí)監(jiān)控系統(tǒng)對數(shù)據(jù)庫自動(dòng)化運(yùn)維進(jìn)行實(shí)踐,幫助數(shù)據(jù)庫維護(hù)人員從大量重復(fù)煩瑣的運(yùn)維工作中解放出來,實(shí)現(xiàn)高效率、自動(dòng)化的數(shù)據(jù)庫管理。
勘誤和資源由于本人水平有限,編寫時(shí)間也比較倉促,書中難免有錯(cuò)誤或者不準(zhǔn)確的地方,在此懇請讀者朋友批評指正。你可以 將書中的錯(cuò)誤發(fā)送到Bug勘誤表頁面中,同時(shí),書中的源碼文件也會(huì)發(fā)布到華章公司的網(wǎng)站上并及時(shí)更新。如果有任何疑問或者建議,也歡迎發(fā)送郵件,期待你們真摯的意見反饋。
致謝感謝Oracle技術(shù)社區(qū)的支持以及來自BAT等企業(yè)的同事和朋友們的技術(shù)分享,感謝Oracle小筑以及Unix DBA等技術(shù)社區(qū)的朋友們,他們包括但不限于李培躍、丁鐵球、周操、文智輝、許劍鋒、陶衛(wèi)、賀學(xué)兵、周立明、李杰斌、羅炳森、龔明全、蹇波等。
感謝機(jī)械工業(yè)出版社華章公司的楊福川老師和李藝?yán)蠋,你們的專業(yè)和熱情深深地打動(dòng)了我,讓我能夠堅(jiān)持完成本書的編寫。同時(shí)感謝你們對本書頁面排版等方面的建議和支持。
感謝公司的同事和領(lǐng)導(dǎo),謝謝你們給予我較為充裕的時(shí)間來完成本書。
特別感謝我的朋友李亞、李純香、鄭勇斌,謝謝你們對本書的大力支持。需要額外感謝的還有蓋國強(qiáng)老師以及馮大輝老師等。
最后要感謝我的妻子劉楊及父母對我和孩子的照顧,因?yàn)橛辛四銈兊睦斫夂椭С郑攀刮矣谐渥愕臅r(shí)間和精力來完成本書。
謹(jǐn)以本書獻(xiàn)給那些還在追逐、熱愛Oracle技術(shù),并依然堅(jiān)持夢想的朋友們。
冷 菠
冷菠,DBA,有近10年Oracle數(shù)據(jù)庫管理與運(yùn)維經(jīng)驗(yàn),曾擔(dān)任美資企業(yè)Senior DBA職務(wù)、支付寶成都公司數(shù)據(jù)庫團(tuán)隊(duì)負(fù)責(zé)人,現(xiàn)就職于上市公司海康威視重慶分公司。
擅長數(shù)據(jù)庫備份恢復(fù)、數(shù)據(jù)庫性能診斷優(yōu)化以及數(shù)據(jù)庫運(yùn)維自動(dòng)化等,對于主機(jī)存儲、網(wǎng)絡(luò)、系統(tǒng)業(yè)務(wù)架構(gòu)、大數(shù)據(jù)有較為深入的研究。目前致力于大數(shù)據(jù)、智能一體化、開源云計(jì)算等領(lǐng)域的佳實(shí)踐探索。主要涉及領(lǐng)域有通信、金融、游戲、政府部門以及傳統(tǒng)制造業(yè)領(lǐng)域。
網(wǎng)名悠然,活躍于國內(nèi)外Oracle、Unix技術(shù)交流群。
Contents 目錄
前言
第一篇 基礎(chǔ)篇
第1章 Linux下的Oracle2
1.1 Linux簡介2
1.2 Oracle簡介3
1.3 Linux內(nèi)存體系的優(yōu)勢3
1.4 Linux內(nèi)存體系與Oracle內(nèi)存空間5
1.4.1 Linux用戶空間與內(nèi)核空間5
1.4.2 Linux下的Oracle內(nèi)存體系結(jié)構(gòu)5
1.4.3 Linux下的Oracle內(nèi)存分配6
1.5 小結(jié)9
第2章 Oracle內(nèi)存體系結(jié)構(gòu)10
2.1 閂(Latch)10
2.1.1 Latch簡介10
2.1.2 Latch Level11
2.1.3 Latch獲取模式12
2.1.4 Latch獲取等待13
2.1.5 Latch資源清理回收15
2.2 隊(duì)列鎖(Enqueue Lock)16
2.2.1 Lock與Latch的區(qū)別16
2.2.2 常見的Lock17
2.2.3 Lock相關(guān)參數(shù)18
2.2.4 Lock先請求先服務(wù)機(jī)制18
2.3 Library Cache21
2.3.1 Library Cache與SQL游標(biāo)21
2.3.2 Library Cache內(nèi)存結(jié)構(gòu)28
2.3.3 Library Cache Lock(Pin)31
2.4 Buffer Cache34
2.4.1 Buffer(Cache)Pool34
2.4.2 Cache Buffer Chain(Latch)37
2.4.3 Cache Buffer Pin40
2.4.4 Buffer Cache等待與優(yōu)化44
2.5 小結(jié)47
第3章 Oracle重做日志(Redo)48
3.1 Redo功能用途48
3.2 Redo組成結(jié)構(gòu)49
3.2.1 Redo Header49
3.2.2 Redo Record49
3.3 Redo產(chǎn)生場景53
3.3.1 Redo與DML事務(wù)53
3.3.2 Redo與Block Cleanout55
3.3.3 Redo與Block Write56
3.3.4 Redo與Hot Backup56
3.3.5 Redo與Direct Load56
3.3.6 Redo與Nologging57
3.4 Redo優(yōu)化58
3.5 小結(jié)61
第4章 Oracle事務(wù)與回滾段62
4.1 Oracle事務(wù)62
4.1.1 Oracle事務(wù)概覽62
4.1.2 Oracle事務(wù)ACID原則63
4.1.3 Oracle事務(wù)與回滾段運(yùn)行機(jī)制64
4.2 Oracle回滾段70
4.2.1 回滾段與一致性讀70
4.2.2 回滾段與事務(wù)鎖定71
4.2.3 回滾段與塊清除72
4.3 Oracle事務(wù)恢復(fù)73
4.3.1 回滾操作下的事務(wù)恢復(fù)73
4.3.2 進(jìn)程崩潰下的事務(wù)恢復(fù)74
4.3.3 實(shí)例崩潰下的事務(wù)恢復(fù)75
4.3.4 數(shù)據(jù)庫異常關(guān)閉下的事務(wù)恢復(fù)75
4.4 Oracle回滾段特殊恢復(fù)76
4.4.1 Oracle回滾段特殊恢復(fù)隱藏參數(shù)77
4.4.2 Oracle回滾段特殊恢復(fù)場景78
4.4.3 Oracle回滾段特殊恢復(fù)實(shí)戰(zhàn)80
4.5 小結(jié)81
第二篇 優(yōu)化篇
第5章 Oracle SQL優(yōu)化84
5.1 Oracle SQL游標(biāo)84
5.1.1 私有SQL游標(biāo)84
5.1.2 共享SQL游標(biāo)85
5.1.3 Library Cache中的SQL游標(biāo)85
5.1.4 SQL游標(biāo)與Session游標(biāo)緩存區(qū)88
5.2 Oracle SQL解析與執(zhí)行91
5.2.1 Oracle SQL解析91
5.2.2 Oracle SQL執(zhí)行93
5.3 Oracle表連接查詢96
5.3.1 NESTED LOOPS97
5.3.2 HASH JOIN97
5.3.3 SORT MERGE98
5.4 Oracle統(tǒng)計(jì)信息98
5.4.1 默認(rèn)統(tǒng)計(jì)信息98
5.4.2 手動(dòng)搜集統(tǒng)計(jì)信息99
5.5 Oracle直方圖102
5.5.1 直方圖概要102
5.5.2 直方圖優(yōu)化103
5.6 Oracle提示107
5.6.1 Oracle提示的語法及使用108
5.6.2 Oracle提示失效場景108
5.7 Oracle SQL跟蹤109
5.7.1 10046事件跟蹤109
5.7.2 SQL跟蹤與Tkprof112
5.8 小結(jié)113
第6章 Oracle CBO優(yōu)化114
6.1 CBO優(yōu)化器模式與CPU成本114
6.1.1 CBO優(yōu)化器模式114
6.1.2 CBO優(yōu)化器模式下的執(zhí)行計(jì)劃調(diào)整115
6.1.3 CPU成本121
6.1.4 CPU成本啟用124
6.2 謂詞選擇率與基數(shù)計(jì)算124
6.2.1 單謂詞選擇率與基數(shù)計(jì)算124
6.2.2 多謂詞選擇率與基數(shù)計(jì)算129
6.3 表連接選擇率與基數(shù)計(jì)算132
6.3.1 表連接選擇率與基數(shù)計(jì)算解析132
6.3.2 表連接選擇率與基數(shù)計(jì)算驗(yàn)證134
6.4 Oracle查詢轉(zhuǎn)換提示136
6.4.1 dynamic_sampling提示136
6.4.2 leading與ordered提示138
6.4.3 index提示140
6.4.4 index_join提示141
6.4.5 index_ffs提示142
6.4.6 index_ss提示144
6.4.7 index_combine提示145
6.4.8 use_concat提示147
6.4.9 expand與no_expand提示148
6.4.10 merge與no_merge提示148
6.4.11 unnest與no_unnest提示150
6.4.12 push_pred與no_push_pred提示151
6.4.13 push_subq與no_push_subq提示152
6.4.14 pq_distribute提示155
6.4.15 driving_site提示158
6.5 小結(jié)159
第三篇 方法篇
第7章 Oracle備份恢復(fù)162
7.1 備份恢復(fù)與日志記錄體系162
7.1.1 Oracle日志記錄體系162
7.1.2 Oracle備份恢復(fù)與日志記錄體系166
7.2 備份恢復(fù)與物理文件183
7.2.1 備份恢復(fù)與控制文件184
7.2.2 備份恢復(fù)與數(shù)據(jù)文件(頭)201
7.2.3 備份恢復(fù)與日志文件(頭)204
7.3 備份恢復(fù)實(shí)現(xiàn)205
7.3.1 Shutdown Clean恢復(fù)206
7.3.2 Shutdown Abort(Crash)恢復(fù)210
7.3.3 冷備恢復(fù)213
7.3.4 熱備恢復(fù)216
7.4 制定RMAN備份恢復(fù)計(jì)劃224
7.4.1 RMAN備份策略制定224
7.4.2 RMAN備份腳本227
7.4.3 RMAN日常備份腳本228
7.5 小結(jié)235
第8章 Oracle自動(dòng)化運(yùn)維管理系統(tǒng)236
8.1 Oracle自動(dòng)化查詢管理系統(tǒng)236
8.1.1 查詢表空間使用情況237
8.1.2 查詢Lock鎖定信息239
8.1.3 查詢事務(wù)運(yùn)行狀態(tài)240
8.1.4 查詢LibraryCache命中率241
8.1.5 查詢Bu