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