本書由數(shù)據庫專業(yè)開發(fā)人員撰寫,系統(tǒng)介紹PostgreSQL10的豐富特性,及其在生產實踐運維中的技巧,全書分為基礎篇、核心篇、進階篇,共18章;A篇包括第1~4章,主要介紹PostgreSQL基礎知識,例如安裝與配置、客戶端工具、數(shù)據類型、SQL高級特性等,為讀者閱讀核心篇和進階篇做好準備;核心篇包括第5-9章,主要介紹PostgreSQL核心內容,例如體系結構、并行查詢、事務與并發(fā)控制、分區(qū)表等;進階篇包括第10~18章,主要介紹PostgreSQL高級內容,例如性能優(yōu)化、物理復制、邏輯復制、備份與恢復、高可用、版本升級、擴展模塊、Oracle數(shù)據庫遷移PostgreSQL實戰(zhàn)、PostGIS等。
這是一本值得存放于身旁的PostgreSQL參考書,特別是性能分析、集群、分片、地理信息等高技術含量的章節(jié),可以作為日常工作的有效參考。本書基于新的PostgreSQL 10版本,重點在于通過實際操作為讀者全方位解讀PostgreSQL。從安裝配置、連接使用、數(shù)據管理、體系架構,到NoSQL操作、性能優(yōu)化、集群部署、分布式、分片、地理信息,面面俱到。
Preface 前 言PostgreSQL擁有近三十年的歷史,是目前最先進的開源數(shù)據庫,PostgreSQL具備豐富的企業(yè)級特性,盡管在歐美、日本使用非常廣泛,但在國內并沒有得到廣泛使用,產生這種情形的原因是多樣的,其中與PostgreSQL中文資料匱乏有較大關系,目前市場上PostgreSQL中文書籍非常少。
筆者從2010年開始從事PostgreSQL DBA工作,在PostgreSQL數(shù)據庫運維工程中積累了一些經驗,因此想系統(tǒng)編寫一本PostgreSQL書籍,一方面總結自己在PostgreSQL數(shù)據庫運維方面的經驗,另一方面希望對PostgreSQL從業(yè)者有所幫助,同時希望給PostgreSQL在國內的發(fā)展貢獻一份力量;本書的另一位作者張文升擁有豐富的PostgreSQL運維經驗,目前就職于探探科技任首席PostgreSQL DBA,他的加入極大地豐富了此書的內容。
近幾年PostgreSQL在國內得到較快的發(fā)展,平安科技、去哪兒網、探探科技、斯凱網絡等公司都在逐步使用PostgreSQL,目前阿里云、騰訊云、華為云等主流云服務提供商也提供了基于PostgreSQL數(shù)據庫的云服務,相信PostgreSQL在國內將有更廣闊的發(fā)展。
本書主要內容本書系統(tǒng)介紹PostgreSQL的豐富特性,以及生產實踐運維中的技巧,全書分為基礎篇、核心篇、進階篇;A篇包括第1~4章,主要介紹PostgreSQL基礎知識,例如安裝與配置、客戶端工具、數(shù)據類型、SQL高級特性等,為讀者閱讀核心篇和進階篇做好準備;核心篇包括第5~9章,主要介紹PostgreSQL核心內容,例如體系結構、并行查詢、事務與并發(fā)控制、分區(qū)表等;進階篇包括第10~18章,主要介紹PostgreSQL進階內容,相比前兩篇進階篇的難度有一定程度增加,例如性能優(yōu)化、物理復制、邏輯復制、備份與恢復、高可用、版本升級、擴展模塊、Oracle數(shù)據庫遷移PostgreSQL實戰(zhàn)、PostGIS等。本書18章主要內容如下。
第1章:介紹PostgreSQL起源、安裝、數(shù)據庫實例創(chuàng)建、數(shù)據庫配置、數(shù)據庫的啟動和停止等。
第2章:介紹psql命令行客戶端工具的使用和特性,例如psql元命令、psql導入導出數(shù)據、使用psql執(zhí)行腳本、psql的亮點功能等。
第3章:介紹PostgreSQL各種數(shù)據類型,包括字符類型、時間/日期類型、布爾類型、網絡地址類型、數(shù)組類型、范圍類型、json/jsonb類型等;同時介紹了數(shù)據類型相關函數(shù)、操作符、數(shù)據類型轉換。
第4章:主要介紹PostgreSQL支持的一些高級SQL特性,例如WITH查詢、批量插入、RETURNING返回DML修改的數(shù)據、UPSERT、數(shù)據抽樣、聚合函數(shù)、窗口函數(shù)等。
第5章:簡單介紹PostgreSQL的邏輯結構和物理結構,以及PostgreSQL的守護進程、服務進程和輔助進程。
第6章:介紹PostgreSQL并行查詢相關配置與應用,以及多表關聯(lián)中并行的使用。
第7章:介紹事務的基本概念、性質和事務隔離級別,以及PostgreSQL多版本并發(fā)控制的原理和機制。
第8章:介紹傳統(tǒng)分區(qū)表和內置分區(qū)表的部署、分區(qū)維護和性能測試。
第9章:介紹PostgreSQL的NoSQL特性,以及PostgreSQL全文檢索。
第10章:簡單介紹了服務器硬件、操作系統(tǒng)配置對性能的影響,介紹了一些常用的Linux性能監(jiān)控工具,并著重介紹了對性能影響較大的幾個方面,以及性能優(yōu)化方案。
第11章:著重介紹PostgreSQL內置的測試工具pgbench,以及如何使用pgbench的內置腳本和自定義腳本進行基準測試。
第12章:主要介紹PostgreSQL物理復制和邏輯復制,并結合筆者在數(shù)據庫維護過程中的實踐經驗分享了三個典型的流復制維護生產案例。
第13章:重點介紹PostgreSQL物理備份、增量備份,同時演示了數(shù)據庫恢復的幾種場景。
第14章:介紹兩種高可用方案,一種是基于Pgpool-II和異步流復制的高可用方案,另一種是基于Keepalived和異步流復制的高可用方案。
第15章:介紹PostgreSQL版本命名規(guī)則、支撐策略、歷史版本演進,介紹了小版本升級,最后重點介紹了大版本升級的三種方式。
第16章:主要介紹一些常見的外部擴展,例如file_fdw、pg_stat_statements、auto_explain、postgres_fdw,并重點介紹Citus外部擴展。
第17章:從實際案例出發(fā),分享了一個Oracle數(shù)據庫遷移到PostgreSQL數(shù)據庫的實際項目。
第18章:簡單介紹PostGIS部署、幾何對象的輸入、輸出、存儲、運算,最后介紹了PostGIS的一個典型應用場景:圈人與地理圍欄。
本書特點本書不是PostgreSQL入門書籍,不會介紹PostgreSQL每個基礎知識點,本書從PostgreSQL生產實踐運維出發(fā),對PostgreSQL重點內容進行詳細講解并給出演示示例,是一本PostgreSQL數(shù)據庫運維實戰(zhàn)書籍。
本書基于PostgreSQL 10編寫,書中涵蓋了大量PostgreSQL 10重量級新特性,例如內置分區(qū)表、邏輯復制、并行查詢增強、同步復制優(yōu)選提交等,通過閱讀此書,讀者能夠學習到PostgreSQL 10重量級新特性。
本書共18章,如果你對PostgreSQL有一定的運維經驗,完全可以不按章節(jié)順序,而是選擇比較關注的章節(jié)進行閱讀。如果你完全沒有PostgreSQL數(shù)據庫基礎,建議先通過其他資料大致掌握PostgreSQL基礎知識,再來閱讀本書,相信你在此書的閱讀過程中能有收獲。
讀者對象本書適合有一定
譚峰 網名francs,中國開源軟件推進聯(lián)盟PostgreSQL分會特聘專家,《PostgreSQL 9 Administration Cookbook》譯者之一,《PostgreSQL High Performance Cookbook》英文版技術審校者之一,曾在杭州斯凱網絡科技有限公司從事PostgreSQL DBA一職六年。熱忠于博客分享PostgreSQL經驗,分享技術博客500余篇,F(xiàn)就職于浙江移動負責應用上云架構管控、資源分配以及私有云建設工作。
張文升 中國開源軟件推進聯(lián)盟PostgreSQL分會核心成員之一。常年活躍于PostgreSQL、MySQL、Redis等開源技術社區(qū),堅持推動PostgreSQL在中國地區(qū)的發(fā)展,多次參與組織PostgreSQL全國用戶大會。近年來致力于推動PostgreSQL在互聯(lián)網企業(yè)的應用以及企業(yè)PostgreSQL培訓與技術支持。
Contents 目錄
序言
前言
基 礎 篇
第1章 安裝與配置基礎2
1.1 初識PostgreSQL2
1.1.1 PostgreSQL的特點3
1.1.2 許可3
1.1.3 郵件列表和討論區(qū)3
1.2 安裝PostgreSQL3
1.2.1 通過yum源安裝4
1.2.2 通過源碼編譯安裝5
1.2.3 設置一個軟鏈接7
1.3 客戶端程序和服務器程序8
1.3.1 客戶端程序8
1.3.2 服務器程序11
1.4 創(chuàng)建數(shù)據庫實例11
1.4.1 創(chuàng)建操作系統(tǒng)用戶11
1.4.2 創(chuàng)建數(shù)據目錄12
1.4.3 初始化數(shù)據目錄13
1.5 啟動和停止數(shù)據庫服務器14
1.5.1 使用service方式15
1.5.2 使用pg_ctl進行管理15
1.5.3 其他啟動和關閉數(shù)據庫服務器的方式16
1.5.4 配置開機啟動16
1.6 數(shù)據庫配置基礎17
1.6.1 配置文件的位置17
1.6.2 pg_hba.conf17
1.6.3 postgresql.conf19
1.6.4 允許遠程訪問數(shù)據庫20
1.7 本章小結22
第2章 客戶端工具23
2.1 pgAdmin 4簡介23
2.1.1 pgAdmin 4 安裝23
2.1.2 pgAdmin 4 使用23
2.2 psql功能及應用26
2.2.1 使用psql連接數(shù)據庫26
2.2.2 psql元命令介紹28
2.2.3 psql導入、導出表數(shù)據31
2.2.4 psql的語法和選項介紹34
2.2.5 psql執(zhí)行sql腳本36
2.2.6 psql如何傳遞變量到SQL37
2.2.7 使用psql定制日常維護腳本38
2.2.8 psql亮點功能39
2.3 本章小結43
第3章 數(shù)據類型44
3.1 數(shù)字類型44
3.1.1 數(shù)字類型列表44
3.1.2 數(shù)字類型操作符和數(shù)學函數(shù)46
3.2 字符類型47
3.2.1 字符類型列表47
3.2.2 字符類型函數(shù)48
3.3 時間/日期類型49
3.3.1 時間/日期類型列表49
3.3.2 時間/日期類型操作符50
3.3.3 時間/日期類型常用函數(shù)51
3.4 布爾類型52
3.5 網絡地址類型53
3.5.1 網絡地址類型列表54
3.5.2 網絡地址操作符55
3.5.3 網絡地址函數(shù)56
3.6 數(shù)組類型56
3.6.1 數(shù)組類型定義56
3.6.2 數(shù)組類型值輸入56
3.6.3 查詢數(shù)組元素57
3.6.4 數(shù)組元素的追加、刪除、更新58
3.6.5 數(shù)組操作符58
3.6.6 數(shù)組函數(shù)59
3.7 范圍類型60
3.7.1 范圍類型列表60
3.7.2 范圍類型邊界61
3.7.3 范圍類型操作符62
3.7.4 范圍類型函數(shù)62
3.7.5 給范圍類型創(chuàng)建索引63
3.8 json/jsonb類型63
3.8.1 json類型簡介63
3.8.2 查詢json數(shù)據64
3.8.3 jsonb與json差異64
3.8.4 jsonb與json操作符65
3.8.5 jsonb與json函數(shù)66
3.8.6 jsonb鍵/值的追加、刪除、更新66
3.9 數(shù)據類型轉換68
3.9.1 通過格式化函數(shù)進行轉換68
3.9.2 通過CAST函數(shù)進行轉換68
3.9.3 通過::操作符進行轉換69
3.10 本章小結70
第4章 SQL高級特性71
4.1 WITH查詢71
4.1.1 復雜查詢使用CTE71
4.1.2 遞歸查詢使用CTE72
4.2 批量插入74
4.2.1 方式一:INSERT INTO...SELECT...74
4.2.2 方式二:INSERT INTO VALUES (),(),...()75
4.2.3 方式三:COPY或\COPY元命令75
4.3 RETURNING返回修改的數(shù)據76
4.3.1 RETURNING返回插入的數(shù)據76
4.3.2 RETURNING返回更新后數(shù)據77
4.3.3 RETURNING返回刪除的數(shù)據77
4.4 UPSERT78
4.4.1 UPSERT場景演示78
4.4.2 UPSERT語法79
4.5 數(shù)據抽樣80
4.5.1 SYSTEM抽樣方式81
4.5.2 BERNOULLI抽樣方式82
4.6 聚合函數(shù)84
4.6.1 string_agg函數(shù)84
4.6.2 array_agg函數(shù)85
4.7 窗口函數(shù)86
4.7.1 窗口函數(shù)語法86
4.7.2 avg() OVER()87
4.7.3 row_number()88
4.7.4 rank()89
4.7.5 dense_rank ()89
4.7.6 lag()90
4.7.7 first_value ()91
4.7.8 last_value ()91
4.7.9 nth_value ()92
4.7.10 窗口函數(shù)別名的使用92
4.8 本章小結93
核 心 篇
第5章 體系結構96
5.1 邏輯和物理存儲結構96
5.1.1 邏輯存儲結構96
5.1.2 物理存儲結構97
5.2 進程結構105
5.2.1 守護進程與服務進程105
5.2.2 輔助進程105
5.3 內存結構106
5.3.1 本地內存106
5.3.2 共享內存107
5.4 本章小結107
第6章 并行查詢109
6.1 并行查詢相關配置參數(shù)109
6.2 并行掃描111
6.2.1 并行順序掃描111
6.2.2 并行索引掃描112
6.2.3 并行index-only掃描114
6.2.4 并行bitmap heap掃描115
6.3 并行聚合117
6.4 多表關聯(lián)119
6.4.1 Nested loop多表關聯(lián)120
6.4.2 Merge join多表關聯(lián)121
6.4.3 Hash join多表關聯(lián)122
6.5 本章小結124
第7章 事務與并發(fā)控制125
7.1 事務和并發(fā)控制的概念125
7.1.1 事務的基本概念和性質125
7.1.2 并發(fā)引發(fā)的現(xiàn)象126
7.1.3 ANSI SQL標準的事務隔離級別129
7.2 PostgreSQL的事務隔離級別130
7.2.1 查看和設置數(shù)據庫的事務隔離級別131
7.2.2 修改全局的事務隔離級別132
7.2.3 查看當前會話的事務隔離級別132
7.2.4 設置當前會話的事務隔離級別132
7.2.5 設置當前事務的事務隔離級別133
7.3 PostgreSQL的并發(fā)控制133
7.3.1 基于鎖的并發(fā)控制134
7.3.2 基于多版本的并發(fā)控制134
7.3.3 通過pageinspect觀察MVCC137
7.3.4 使用pg_repack解決表膨脹問題140
7.3.5 支持事務的DDL140
7.4 本章小結141
第8章 分區(qū)表142
8.1 分區(qū)表的