【為宏觀掌握Oracle基礎(第1~3章)】,介紹了進程管理、內存管理及存儲等基礎知識,并且講解了常用Linux操作系統性能工具的使用及結果分析方法,旨在幫助讀者了從宏觀視角掌握Oracle數據庫體系架構和進程組織方案。【微觀理解Oracle原理(第4~8章)】,圍繞Oracle內部運行原理展開講解。首先,在Oracle數據結構的基礎上討論日志和回滾。其次,引入了排隊論和排隊系統中的概念,對比法講解了Oracle的數據緩沖區高速緩存和共享池設計思想及運行原理。【串聯Oracle運行流程(第9~11章)】,結合實踐案例將從提交SQL至結果返回的整個過程串起來,首先總結歸納了Oracle算法和數據結構的重要知識點,打通了Oracle原理與數據結構之間的橋梁。其次,通過典型案例講解AWR報告,讓讀者能夠了解完整的Oracle診斷思路。再次,介紹了集群技術、Oracle RAC及其日志結構。然后,對Oracle多租戶架構的演進過程及部分新特性進行了簡要討論及總結。
(1)作者專業實力強勁:作者本身為資深Oracle OCM,主導過10余個大型數據平臺建設案例及眾多小型數據項目,并在武漢大學專門進修,最終總結15年來親身經驗,鑄就本書。
(2)眾多大咖力薦:蓋國強、呂海波、李石君教授、周亮好評推薦,從實戰到理論,從業務到學術,眾多專家率先肯定了本書的實力與貢獻。
(3)知識體系完善、深入淺出:本書旨在全面串聯Oracle原理與技術體系,既補全了Unix系統內核、進程、排隊論、集群等關聯知識點,又深入淺出講解了集中式數據庫系統和Oracle RAC集群核心技術組件的基本概念、設計思想、實現方式,同時深度剖析其算法及AWR報告,并配合大量直觀圖示。通過本書,讀者將更加系統地認識數據庫,也容易進一步學習國產數據庫的原理與操作。
(4)聯系工作實際、實戰性強:本書從DBA工作實際需求出發,不但提供體系化理論,更提供了高效、穩定的數據庫系統實踐及優化方法。無論讀者從事數據庫運維還是內核研發,都能從本書中獲得借鑒思路與參考方法。
為什么要寫這本書
數據庫管理知識,除了數據庫本身的基本概念、設計、實現等知識以外,還涉及操作系統、存儲、網絡等內容。尤其是在對生產業務數據庫進行復雜的故障診斷及性能優化時,我們總會發現僅掌握數據庫本身的知識并不夠。但是作為初中級DBA(數據庫管理員),我們會在某個階段陷入學習瓶頸,找不到突破的方法。
自從2008年接觸Oracle數據庫以來,我看了大量關于Oracle的國內外書籍,但對很多內容體會不深,看了沒多久就忘了。我曾在2015年參加OCM認證考試,發現數據庫性能優化和故障診斷等方面的能力無法僅憑學習考試涉及的理論知識獲取。后來我有幸參加了蓋國強、呂海波等專家開展的DBA短期培訓,收獲很大。與這些專家溝通之后,我對Oracle數據庫的設計思想、架構實現、性能優化等方面有了更深入的理解,并且更進一步探究UNIX內核、進程及進程間通信、數據結構(鏈表、樹、哈希表)、Socket通信等內容。
最終,我有了梳理、總結Oracle數據庫內核知識,并將之與其他相關的關鍵技術點串聯起來、寫作成書的想法。
我把寫書的想法及初步整理的素材發給ACE總監、Oracle顧問專家周亮,獲得了他的鼓勵和幫助。于是,我借著自己2018年在武漢大學訪學的機會,充分利用了該校圖書館里的圖書資源,并結合李石君教授通俗易懂的數據庫原理課程,開始了系統性的整理和寫作之旅。
有很多讀者與我曾經的情況類似,受制于技術瓶頸而徘徊不前,遲遲無法實現進一步提升。而本書是我對自己多年學習和實踐Oracle數據庫的經驗總結,能幫助讀者節省學習時間,少走彎路,突破數據庫的學習瓶頸。
讀者對象
本書適合如下讀者閱讀:
初中級DBA
數據庫技術愛好者
想突破Oracle學習瓶頸并拓寬思路的人
本書特色
掌握Oracle技術及原理,尤其是學習Oracle在并發控制、事務處理、診斷優化手段等方面的解決思路和實現算法,對DBA深入理解關系型數據庫乃至大數據技術有很大幫助。
本書將Oracle相關知識點串聯講解,旨在令讀者對該數據庫理論融會貫通,以應用于實際工作,提高技術水平。而要達到這樣的境界則須理解甚至掌握操作系統、計算機網絡、排隊論等相關的基礎及輔助知識。所以,本書適當引入了超出數據庫本身范疇的知識點,盡量強調概念根源和設計思想,同時力求通過梳理將Oracle相關知識由龐雜變得簡潔有條理,并將其以通俗易懂的語言呈現出來。
如何閱讀本書
本書共11章,分為三篇,各篇主要內容如下。
第一篇(第1~3章) 宏觀掌握Oracle基礎
本篇介紹了進程管理、內存管理及存儲結構等基礎知識,并且講解了Linux操作系統性能工具的使用及結果分析方法,旨在幫助讀者從宏觀視角掌握Oracle數據庫體系架構和進程組織方案。
第二篇(第4~8章) 微觀理解Oracle原理
本篇圍繞Oracle內部運行原理展開講解。首先,在Oracle數據結構的基礎上討論重做和回滾日志。其次,引入了排隊論和并發控制的概念,對比講解了Oracle的數據緩沖區和共享池的設計思想及運行原理。
第三篇(第9~11章) 串聯Oracle運行流程
本篇結合實踐案例將從SQL提交至最終結果返回的整個運行過程串聯起來。首先,總結歸納了Oracle算法和數據結構的重要知識點,打通了Oracle原理與數據結構之間的橋梁。其次,通過典型案例講解AWR(Automatic Workload Repository,自動負載信息庫)報告,讓讀者能夠了解完整的Oracle診斷思路。再次,介紹了集群技術、Oracle RAC(真正應用集群)及其日志結構。最后,對Oracle多租戶架構的演變及部分新特性進行了簡要討論及總結。
如果你是一名經驗豐富的DBA,已經理解了Oracle的相關基礎知識和使用技巧,那么可以直接閱讀第三篇。如果你是一名初學者或中級DBA,那么建議從第一篇開始學習,以便對操作系統及進程等基礎概念建立相對深入且正確的認識。
勘誤和支持
如果書中出現了錯誤或者不準確的地方,懇請讀者批評指正。為了方便與各位讀者交流,我創建了微信公眾號(微信號:kuqlan)。歡迎你將書中的錯誤發給我,或者在遇到Oracle相關問題時留言,我將努力解答。此外,本書中的全部代碼都將發布在該公眾號上。如果你有更多的寶貴意見,也歡迎發送郵件至819287413@qq.com,很期待聽到你的反饋。
致謝
感謝ACE總監周亮。在我寫作本書的過程中,他不但鼓勵我,而且對我的技術疑惑有問必答。沒有他的鼓勵和支持,就不會有這本書。我認為,在數據庫“江湖”中,周亮是故障診斷及處理領域的“小李飛刀”。
感謝呂海波專家。我因OCM(Oracle Certified Master,Oracle認證大師)培訓認識了他,他的課程及著作幫助我深入理解Oracle內核,與他的每次交流都能解決我的許多疑惑。
感謝武漢大學的李石君教授及武大圖書館。李教授的課程進一步鞏固了我的數據庫管理理論基礎;而武大圖書館為我提供了豐富的學習資料,為編寫本書,我幾乎翻遍了這個圖書館里所有與Oracle相關的書籍。
感謝我的家人,他們的理解及默默支持時時刻刻為我灌輸著信心和力量!
玉素甫·買買提
廣電企業資深Oracle OCM,擅長數據庫性能優化、數據遷移、IT系統從0到1的建設和運維過程,目前主要從事數據中心(IDC)及云平臺建設運維相關工作。
近15年來,作為項目經理及主力軍親歷10余個中大型項目建設,如呼叫中心系統、BOSS系統、基于OpenStack的企業云平臺、用戶行為大數據采集與分析平臺、OSS綜合網管、GIS資管系統、IDC建設工程等。
前 言
第一篇 宏觀掌握Oracle基礎
第1章 Oracle概貌及進程 2
1.1 Oracle概貌 2
1.1.1 串聯Oracle知識體系的挑戰 3
1.1.2 UNIX體系結構簡介 4
1.1.3 Oracle進程狀態轉換 6
1.2 充分理解進程 8
1.2.1 何為進程 8
1.2.2 進程的狀態 10
1.2.3 進程切換 11
1.2.4 進程間通信 11
1.3 Oracle的進程組織方案 12
1.3.1 2N方案:一個數據庫服務器
進程對應一個用戶進程 12
1.3.2 N+M方案:M個數據庫服務器進程對應N個用戶進程 14
1.4 Oracle的進程結構 15
1.4.1 Oracle常見進程及簡介 15
1.4.2 Oracle進程的啟動順序 20
1.4.3 進程、連接、會話的區別 21
1.5 本章小結 22
第2章 Oracle內存與實例 24
2.1 虛擬存儲管理 24
2.1.1 操作系統虛擬內存結構 24
2.1.2 共享內存段的概念 26
2.1.3 共享內存段與內核參數 26
2.1.4 查看共享內存段 27
2.1.5 共享內存段與進程 28
2.1.6 內存交換與HugePage 29
2.1.7 內存文件系統 29
2.2 Oracle實例 30
2.2.1 數據庫實例的構成 30
2.2.2 ASM實例的構成 32
2.2.3 ASM啟動與參數文件 33
2.2.4 數據庫實例與ASM實例的
交互 34
2.3 Linux性能分析工具 35
2.3.1 查看進程隊列及系統負載 36
2.3.2 查看I/O 38
2.4 Oracle常用視圖及跟蹤工具 40
2.4.1 常用動態性能視圖 40
2.4.2 查看SQL執行計劃 43
2.4.3 常用診斷和調試工具 46
2.5 本章小結 49
第3章 Oracle存儲結構 50
3.1 存儲體系結構 50
3.1.1 邏輯存儲結構 52
3.1.2 段和表的區別 52
3.1.3 數據塊結構 55
3.1.4 Rowid結構 56
3.1.5 索引結構及索引范圍掃描 59
3.2 數據文件存儲結構 60
3.2.1 數據文件物理存儲結構 61
3.2.2 Oracle數據文件讀取 62
3.3 日志文件存儲結構 65
3.3.1 重做記錄存儲結構 65
3.3.2 檢查點 66
3.3.3 控制文件 68
3.4 ASM存儲結構 70
3.4.1 ASM磁盤組與磁盤 70
3.4.2 ASM文件 72
3.4.3 ASM空間分配 73
3.5 ASM存儲設備配置 76
3.5.1 ASM磁盤發現 76
3.5.2 多路徑配置 78
3.5.3 UDEV簡介及配置 80
3.6 本章小結 81
第二篇 微觀理解Oracle原理
第4章 重做 84
4.1 深入認識重做記錄 84
4.1.1 SCN:系統改變號 85
4.1.2 SEQ與RBA 85
4.1.3 準備重做日志轉儲 86
4.1.4 轉儲文件的內容及構成 87
4.2 IMU與非IMU 89
4.2.1 非IMU的重做日志申請
過程 90
4.2.2 IMU的重做日志申請過程 91
4.3 LGWR的工作原理 93
4.3.1 寫日志流程 93
4.3.2 3秒喚醒和commit寫入的
差異 93
4.4 Redo等待事件 94
4.4.1 log buffer space 94
4.4.2 log file parallel write 94
4.4.3 log file sync 94
4.5 多LGWR進程 95
4.6 本章小結 96
第5章 回滾 98
5.1 回滾的概念及原理 98
5.1.1 Do-Undo-Redo協議 99
5.1.2 Undo部分的生成過程 99
5.1.3 數據塊頭、回滾段頭、回滾塊
之間的關系 104
5.1.4 事務槽及相關等待事件 108
5.2 讀一致性及塊清除 109
5.3 獲取UNDO信息 110
5.4 本章小結 112
第6章 排隊論和并發控制 113
6.1 排隊論和事務處理 113
6.1.1 排隊論的基本概念 113
6.1.2 事務的基本概念 116
6.1.3 事務流 118
6.2 響應時間曲線圖和CPU、I/O
系統模型 119
6.2.1 響應時間曲線圖 119
6.2.2 CPU系統模型 121
6.2.3 I/O系統模型 121
6.3 并發控制和封鎖 122
6.3.1 并發控制的基本概念 122
6.3.2 封鎖的概念和類型 123
6.4 Oracle多粒度鎖機制 123
6.4.1 RDBMS的TM鎖和
意向鎖 124
6.4.2 Oracle的TM鎖和意向鎖 125
6.4.3 Oracle鎖查詢腳本 126
6.5 本章小結 126
第7章 數據緩沖區 128
7.1 數據緩沖區結構 128
7.1.1 Working Set 129
7.1.2 Buffer Header 129
7.1.3 Hash Bucket與
Hash Chain 130
7.2 并發控制及申請流程 131
7.2.1 CBC Latch和Pin 131
7.2.2 共享與獨占 134
7.2.3 LRU隊列 135
7.2.4 數據塊申請流程 137
7.3 物理讀與邏輯讀 139
7.3.1 邏輯讀過程及統計SQL 139
7.3.2 物理讀過程及統計SQL 139
7.4 本章小結 140
第8章 共享池 142
8.1 共享池結構 142
8.1.1 子池 143
8.1.2 空閑列表與LRU 146
8.1.3 共享池內存申請流程 147
8.1.4 ORA-4031報錯過程 149
8.2 SQL解析及并發控制 149
8.2.1 SQL解析及游標 150
8.2.2 library Cache Lock加鎖
步驟 153
8.2.3 cursor_sharing 155
8.2.4 v$latch、v$latch_childred
統計 156
8.3 Mutex 157
8.3.1 Mutex簡介 157
8.3.2 Mutex的類