本書將教你如何構建及運行一個可擴展且已經優化的PostgreSQL服務器。全書始于基本概念(例如從源代碼中安裝PostgreSQL),并逐漸深入理論部分(例如并發性和事務管理)。在此之后,你將學習如何設置副本、使用負載均衡進行水平擴展以及排除故障。繼續閱讀本書,你將看到配置參數對性能、可擴展性以及事務管理所起到的顯著影響。后,你將接觸到PostgreSQL生態系統中那些有用的工具,它們被用來分析PostgreSQL日志、設置負載均衡和進行數據恢復。
PrefacePostgreSQL是一個極其靈活且可靠的開源關系型數據庫。借助它的這般神奇功能,可以在不增加任何費用的情況下,將應用程序變得更加可靠和更具擴展性。一旦掌握了如何設置PostgreSQL并利用它的高級功能,便可節省工時,提高工作效率。
本書將教你如何構建及運行一個可擴展且已經優化的PostgreSQL服務器。
全書始于基本概念(例如從源代碼中安裝PostgreSQL),并逐漸深入理論部分(例如并發性和事務管理)。在此之后,你將學習如何設置副本、使用負載均衡進行水平擴展以及排除故障。
繼續閱讀本書,你將看到配置參數對性能、可擴展性以及事務管理所產生的顯著影響。最后,你將接觸到PostgreSQL生態系統中那些有用的工具,它們用來分析PostgreSQL日志、設置負載均衡和恢復數據。
本書主要內容第1章概括性地介紹如何從源代碼中安裝PostgreSQL。該章內容列舉了從源代碼中進行編譯的先決條件,并說明了如何在UNIX / Linux環境中初始化一個集群。同時,該章也涵蓋了本書的目錄結構。
第2章描述啟動PostgreSQL集群時所涉及的重要進程,同時介紹了這些進程如何與內存結構相互協作,從而實現一個數據庫管理系統所應有的功能。
第3章解釋各種對象類型以及PostgreSQL所提供的各種對象。同時,該章也闡述了各種重要的概念,例如數據庫、集群、表空間和模式。
第4章涵蓋事務所涉及的ACID屬性、隔離級別以及PostgreSQL是如何提供這些功能的。同時,該章也探討了多版本并發控制這個話題。
第5章討論如何使用SQL Power Architect對表以及關系進行建模。同時,該章也介紹了在選擇設計工具時需要考慮的一些注意事項。
第6章介紹了兩個客戶端工具(pgAdmin:一個用戶界面工具,psql:一個命令行工具)。該章介紹了如何使用pgAdmin瀏覽數據庫對象、生成查詢并為查詢產生執行計劃。同時,該章也闡述了如何在psql中為psql連接建立環境變量、查看SQL命令的歷史執行記錄以及元命令。
第7章說明各種查詢優化技術。為了便于讀者理解,該章也列舉了一些數據庫使用相關的范例以及PostgreSQL優化器的工作原理。
第8章介紹對查詢性能具有顯著影響的PostgreSQL服務器設置。這些設置包括內存設置、開銷設置等。同時該章也介紹了兩種對象類型:分區和物化視圖。
第9章介紹相關的常用工具,例如pg_dump、pg_bulkload以及用于PostgreSQL導入與讀取數據的copy功能。
第10章介紹實際操作中的常用方法。該章一步一步地介紹如何使用PostgreSQL的流復制以及pgpool-II來實現水平擴展。同時,該章也介紹PostgreSQL中基于時間點的恢復。
第11章列舉開發者在使用PostgreSQL時經常會遇到的一些問題,并闡述如何解決這些問題。同時,該章也說明連接問題、權限問題與參數設置問題。
第12章引入不少討論話題,列舉每一名數據架構師都應當注意的一些有趣的數據類型、一些真正有用的擴展,以及一個用來分析PostgreSQL日志文件的工具。同時,該章也展示PostgreSQL 9.4版本的一些有趣功能。
閱讀本書的準備工作你必須有一臺能夠聯網的計算機。如果這臺計算機使用的是UNIX / Linux操作系統,那么將對閱讀本書非常有幫助。
本書的目標讀者你需要接觸過一些數據庫,了解基本的數據庫對象,如表和視圖。如果之前未曾或者很少接觸PostgreSQL,你會發現這本書非常有用。如果過去幾年你一直在使用PostgreSQL,同樣還是會從書中找到一些你不熟悉但是有用的命令,或者找到你未曾使用過的數據庫優化方法。借助本書,你將更深入地了解數據庫的工作原理
Jayadevan Maymala,是一位數據庫開發工程師、設計師和架構師。他開始于1999年在甲骨文(Oracle)公司的數據庫部門工作。多年以來,他研究并使用過DB2、Sybase和SQL Server等數據庫產品。 近,他一直致力于開源技術的研究。他選擇的數據庫是PostgreSQL。職業生涯中,他在不同的領域工作過,跨越供應鏈管理、金融和旅游等多個領域。他一方面致力于支持關鍵事務處理系統的數據庫技術,另一方面致力于支持分析系統的數據倉庫技術,在兩方面工作上,他差不多花了等量的時間。
不研究這些開源技術時,他會利用業余時間進行大量閱讀,并不斷更新自己在經濟和政治領域的知識。
我要感謝我的妻子——Uma,因為她可以忍受我在周末進行馬拉松式的寫作。我還要深深感激PostgreSQL社區,社區里面的人總是及時回復我的問題,不管是基礎的還是特殊的問題。這是一個神奇的團隊,他們一直不知疲倦地構建這樣一個宏大的數據庫,然后用這樣的自由許可條款開源。謝謝他們!
About the reviewersPascal Charest,是前沿技術專家,他致力于一系列非常廣泛的開源技術。在網絡基礎設施的戰略規劃領域,他是優秀的系統管理專家,并且經常從事系統架構設計的咨詢工作。可以通過他LinkedIn的個人資料聯系他http://www.linkedin.com/in/pascalcharest。
我想謝謝安東尼(Anthony)和扎卡里(Zachary),不管是白天或黑夜,他們都讓我保持清醒。
作者簡介
審校者簡介
前 言
第1章 安裝PostgreSQL 1
1.1 安裝選項 1
1.1.1 下載并提取源碼 2
1.1.2 檢查源碼內容 3
1.2 編譯源碼的各種依賴 3
1.3 配置和創建makefile 4
1.4 建立和創建可執行文件 6
1.5 安裝和移動文件到指定的位置 7
1.6 初始化集群 9
1.6.1 快速了解各個目錄 11
1.6.2 已創建的進程 13
1.6.3 創建的重要文件 14
1.7 與擴展程序相互協作 14
1.8 小結 15
第2章 服務器架構 16
2.1 從守護進程開始 16
2.2 理解共享緩沖區 18
2.3 檢查點 23
2.4 WAL與WAL寫進程 25
2.4.1 恢復 26
2.4.2 增量備份和基于時間點的恢復 26
2.4.3 復制 27
2.5 后臺寫入器 28
2.6 自動清空加載器進程 29
2.7 日志進程 32
2.8 統計信息收集器進程 35
2.9 WAL發送器和WAL接收器 38
2.10 使用work_mem在內存中進行排序 38
2.11 使用maintenance_work_mem進行維護 40
2.12 小結 42
第3章 PostgreSQL——對象層次和角色 43
3.1 PostgreSQL集群 43
3.2 了解表空間 44
3.2.1 使用臨時表空間管理臨時對象 46
3.2.2 視圖 48
3.3 數據庫、模式與search_path 48
3.4 角色和權限 53
3.5 小結 56
第4章 使用事務進行工作 57
4.1 了解事務 57
4.2 PostgreSQL和MVCC 67
4.3 小結 70
第5章 使用SQL Power Architect進行數據建模 71
5.1 數據庫工具及其用途 71
5.2 數據庫設計工具 72
5.2.1 下載與安裝SQL Power Architect 73
5.2.2 創建表 74
5.3 生成SQL 75
5.3.1 逆向工程及變更操作 77
5.3.2 導出數據模型 78
5.3.3 分析 78
5.4 小結 79
第6章 客戶端工具 80
6.1 GUI工具與命令行工具 80
6.2 下載與安裝pgAdmin 80
6.2.1 添加一臺服務器 81
6.2.2 pgAdmin主窗口 82
6.2.3 查詢工具 84
6.3 psql——在命令行模式下工作 86
6.3.1 psql——連接選項 86
6.3.2 \d的功能 87
6.3.3 更多元命令 89
6.3.4 設置環境 91
6.3.5 命令的歷史記錄 92
6.4 小結 92
第7章 SQL調優 93
7.1 了解數據庫的基本事實 93
7.1.1 事實1,數據庫中讀比寫更頻繁 93
7.1.2 事實2,數據始終在塊或頁面中讀取,而不是作為單獨的記錄或列 94
7.1.3 減少讀/寫塊的數量的方法 94
7.2 查詢執行組件 95
7.2.1 計劃器 95
7.2.2 訪問方法 95
7.2.3 連接策略 96
7.3 發現執行計劃 96
7.4 優化指南和捕捉 98
7.4.1 外鍵索引 99
7.4.2 使用SELECT* 100
7.4.3 使用ORDER BY 100
7.4.4 使用DISTINCT 101
7.4.5 使用UNION ALL代替UNION 102
7.4.6 在FILTER子句中使用函數 102
7.4.7 減少SQL語句數量 104
7.4.8 減少函數執行 105
7.4.9 不使用索引的情況 107
7.4.10 部分索引 108
7.4.11 優化函數 109
7.5 小結 110
第8章 服務器調優 111
8.1 服務器端內存設置 111
8.1.1 shared_buffers 111
8.1.2 effective_cache_size 112
8.2 管理寫入、連接和維護操作 113
8.3 查找/掃描開銷及統計參數 114
8.4 物化視圖 119
8.5 分區表 121
8.6 小結 125
第9章 PostgreSQL寫入與讀取數據工具 126
9.1 考慮建立生產數據庫 126
9.2 COPY 命令 127
9.3 使用pg_bulkload快速加載 130
9.4 pg_dump 命令 131
9.5 過濾選項 133
9.5.1 pg_dumpall 工具 133
9.5.2 pg_restore 工具 133
9.6 小結 135
第10章 擴展、復制、備份和恢復 136
10.1 可擴展性 136
10.1.1 垂直擴展 137
10.1.2 水平擴展 138
10.2 基于時間點的恢復 154
10.3 小結 157
第11章 PostgreSQL 故障排除 158
11.1 連接問題 158
11.2 驗證和權限問題 159
11.3 參數更改無效 161
11.4 查詢無響應 162
11.5 小結 165
第12章 PostgreSQL額外功能 166
12.1 有趣的數據類型 166
12.1.1 range 166
12.1.2 XML 174
12.1.3 幾何與地理數據 175
12.1.4 外部數據封裝器 175
12.1.5 pgbadger 178
12.2 變化中的產品特性 180
12.3 小結 183