本書介紹了 PostgreSQL 內部的工作原理,包括數據庫對象的邏輯組織與物理實現,進程與內存的架構。并依次剖析了幾個重要的子系統:查詢處理、外部數據包裝器、并發控制、清理過程、緩沖 區管理、WAL、備份及流復制。本書為 DBA 與系統開發者提供了一幅全景概念地圖,有助于讀者形 成對數據庫實現的整體認識,亦可作為深入學習 PostgreSQL 源代碼的導讀手冊,對于理解數據庫原 理與 PostgreSQL 內部實現大有裨益。 本書適合數據庫開發人員及相關領域的研究人員、數據庫 DBA 及高等院校相關專業的學生閱讀。
Hironobu SUZUKI,畢業于北海道大學(Hokkaido University)信息工程學院,曾在多家公司擔任軟件開發人員和技術經理/總監。在數據庫和系統集成領域出版了7本書(3本PostgreSQL書籍和3本MySQL書籍)。作為日本PostgreSQL用戶組(2010-2016)的主管,組織了日本最大(非商業)的PostgreSQL技術研討會/講座六年多,并擔任日本PostgreSQL的項目委員會主席。
張文升,武漢工業大學畢業,出版《PostgreSQL實戰 》,2016-至今探探PostgreSQL DBA2014-2016 去哪兒網高級DBA
第1章 數據庫集簇、數據庫和數據表 1
1.1 數據庫集簇的邏輯結構 1
1.2 數據庫集簇的物理結構 2
1.2.1 數據庫集簇的布局 3
1.2.2 數據庫布局 4
1.2.3 表和索引相關文件的布局 5
1.2.4 PostgreSQL中表空間的布局 7
1.3 堆表文件的內部布局 8
1.4 讀寫元組的方式 11
1.4.1 寫入堆元組 11
1.4.2 讀取堆元組 12
第2章 進程和內存架構 14
2.1 進程架構 14
2.1.1 Postgres服務器進程 15
2.1.2 后端進程 15
2.1.3 后臺進程 16
2.2 內存架構 17
2.2.1 本地內存區域 17
2.2.2 共享內存區域 18
第3章 查詢處理 19
3.1 概覽 20
3.1.1 解析器 20
3.1.2 分析器 22
3.1.3 重寫器 24
3.1.4 計劃器與執行器 25
3.2 單表查詢的代價估計 27
3.2.1 順序掃描 28
3.2.2 索引掃描 29
3.2.3 排序 36
3.3 創建單表查詢的計劃樹 38
3.3.1 預處理 41
3.3.2 找出代價最小的訪問路徑 42
3.3.3 創建計劃樹 51
3.4 執行器如何工作 55
3.5 連接 57
3.5.1 嵌套循環連接 57
3.5.2 歸并連接 63
3.5.3 散列連接 67
3.5.4 連接訪問路徑與連接節點 73
3.6 創建多表查詢計劃樹 76
3.6.1 預處理 76
3.6.2 獲取代價最小的路徑 77
3.6.3 獲取三表查詢代價最小的路徑 81
參考文獻 83
第4章 外部數據包裝器 84
4.1 概述 85
4.1.1 創建一棵查詢樹 86
4.1.2 連接至遠程服務器 86
4.1.3 使用EXPLAIN命令創建計劃樹(可選) 87
4.1.4 逆解析 87
4.1.5 發送SQL命令并接收結果 88
4.2 POSTGRES_FDW的工作原理 90
4.2.1 多表查詢 91
4.2.2 排序操作 97
4.2.3 聚合函數 98
第5章 并發控制 101
5.1 事務標識 103
5.2 元組結構 104
5.3 元組的增、刪、改 106
5.3.1 插入 106
5.3.2 刪除 107
5.3.3 更新 108
5.3.4 空閑空間映射 109
5.4 提交日志 110
5.4.1 事務狀態 110
5.4.2 提交日志如何工作 110
5.4.3 提交日志的維護 111
5.5 事務快照 111
5.6 可見性檢查規則 114
5.6.1 t_xmin的狀態為ABORTED 115
5.6.2 t_xmin的狀態為IN_PROGRESS 115
5.6.3 t_xmin的狀態為COMMITTED 116
5.7 可見性檢查 118
5.7.1 可見性檢查的過程 118
5.7.2 PostgreSQL可重復讀等級中的幻讀 122
5.8 防止丟失更新 122
5.8.1 并發UPDATE命令的行為 123
5.8.2 例子 125
5.9 可串行化快照隔離 127
5.9.1 SSI實現的基本策略 127
5.9.2 PostgreSQL的SSI實現 128
5.9.3 SSI的原理 129
5.9.4 假陽性的串行化異常 132
5.10 需要的維護進程 134
參考文獻 136
第6章 清理過程 137
6.1 并發清理概述 138
6.1.1 第一部分 139
6.1.2 第二部分 140
6.1.3 第三部分 140
6.1.4 后續處理 141
6.2 可見性映射 141
6.3 凍結過程 142
6.3.1 惰性模式 142
6.3.2 迫切模式 143
6.3.3 改進迫切模式中的凍結過程 146
6.4 移除不必要的CLOG文件 147
6.5 自動清理守護進程 148
6.6 完整清理 148
第7章 堆內元組和僅索引掃描 153
7.1 堆內元組 153
7.1.1 沒有HOT時的行更新 153
7.1.2 HOT如何工作 154
7.2 僅索引掃描 157
第8章 緩沖區管理器 160
8.1 概覽 161
8.2 緩沖區管理器的結構 163
8.2.1 緩沖表 164
8.2.2 緩沖區描述符 165
8.2.3 緩沖區描述符層 167
8.2.4 緩沖池 169
8.3 緩沖區管理器鎖 169
8.3.1 緩沖表鎖 170
8.3.2 緩沖區描述符相關的鎖 170
8.4 緩沖區管理器的工作原理 174
8.4.1 訪問存儲在緩沖池中的頁面 174
8.4.2 將頁面從存儲加載到空槽 175
8.4.3 將頁面從存儲加載到受害者緩沖池槽 176
8.4.4 頁面替換算法:時鐘掃描 178
8.5 環形緩沖區 180
8.6 臟頁刷盤 181
第9章 WAL 182
9.1 概述 183
9.1.1 沒有WAL的插入操作 183
9.1.2 插入操作與數據庫恢復 184
9.1.3 整頁寫入 186
9.2 事務日志與WAL段文件 188
9.3 WAL段文件的內部布局 190
9.4 WAL記錄的內部布局 191
9.4.1 WAL記錄首部部分 191
9.4.2 XLOG記錄的數據部分(9.4及更低版本) 193
9.4.3 XLOG記錄的數據部分(9.5及更高版本) 196
9.5 WAL記錄的寫入 200
9.6 WAL寫入進程 203
9.7 POSTGRESQL中的檢查點進程 203
9.7.1 檢查點進程概述 204
9.7.2 pg_crontrol文件 205
9.8 POSTGRESQL中的數據庫恢復 206
9.9 WAL段文件管理 209
9.9.1 WAL段切換 209
9.9.2 WAL段管理(9.5及更高版本) 209
9.9.3 WAL段管理(9.4及更低版本) 211
9.10 持續歸檔與歸檔日志 212
第10章 基礎備份與時間點恢復 214
10.1 基礎備份 215
10.1.1 pg_start_backup 215
10.1.2 pg_stop_backup 217
10.2 時間點恢復(PITR)的工作原理 217
10.3 時間線與時間線歷史文件 220
10.3.1 時間線標識 220
10.3.2 時間線歷史文件 221
10.4 時間點恢復與時間線歷史文件 222
第11章 流復制 224
11.1 流復制的啟動 225
11.2 如何實施流復制 227
11.2.1 主從間的通信 227
11.2.2 發生故障時的行為 229
11.3 管理多個備庫 229
11.3.1 同步優先級與同步狀態 229
11.3.2 主庫如何管理多個備庫 230
11.3.3 發生故障時的行為 231
11.4 備庫的故障檢測 232