目錄
一、PostgreSQL
1. 簡介
2. 特點
(1)?開源免費(Open Source)
(2)標準兼容(SQL Compliance)
(3)?豐富的數據類型(Data Types)
(4)?強大的事務與并發控制(Transactions & Concurrency)
(5)高度可擴展(Extensibility)
(6)企業級安全性(Security)
3. 優勢
4. 架構
5. 應用場景
6. 結論
二、安裝PostgreSQL
1. 編譯安裝
(1)安裝編譯安裝所需環境
(2)編譯安裝
(3)配置環境變量
(4)登錄數據庫
三、PostgreSQL 結構
1. PG 的邏輯結構?編輯
2. PG 的物理結構
(1)軟件安裝目錄
(2)數據庫目錄結構?編輯
(3)數據庫有兩個基礎的對象,一個是oid, 一個是表空間
(4)base 的物理布局設計
(5)表空間跟數據庫關系
一、PostgreSQL
1. 簡介
PostgreSQL(簡稱Postgres)是一款功能強大的開源對象-關系型數據庫管理系統(ORDBMS),強調對SQL標準的全面支持,并逐漸發展成為兼具關系型數據庫嚴謹性和面向對象靈活性的開源數據庫。
其核心設計理念包括高度可擴展性、數據完整性及對復雜查詢的支持,廣泛應用于企業級應用、數據分析、地理信息系統(GIS)等領域
2. 特點
(1)?開源免費(Open Source)
- 基于?PostgreSQL License(類 BSD 協議),允許自由使用、修改和商業發布,無版權限制。
- 社區驅動開發,全球開發者貢獻代碼,版本迭代活躍(如近年新增 JSONB 全文索引、向量存儲等前沿功能)。
(2)標準兼容(SQL Compliance)
- 支持?ANSI SQL 標準(如窗口函數、CTE、事務隔離級別),同時擴展了大量企業級特性(如遞歸查詢、行級鎖)。
- 兼容?SQL/JSON 標準,JSONB 類型支持高效索引和查詢,適合現代 Web 應用的半結構化數據場景。
(3)?豐富的數據類型(Data Types)
- 基礎類型:除傳統數值、字符串、日期外,支持數組(Array)、枚舉(Enum)、范圍類型(如 int4range 表示整數區間)。
- 高級類型:
- 空間數據:通過 PostGIS 擴展支持幾何圖形(Point、LineString、Polygon)和地理信息系統(GIS)功能。
- 全文搜索:內置 tsvector/tsquery 類型,支持分詞、模糊匹配和相關性排序。
- 新興類型:支持 JSONB(可索引的 JSON)、XML、IPv6、UUID,以及 PostgreSQL 15 + 新增的向量類型(用于 AI / 機器學習場景)。
(4)?強大的事務與并發控制(Transactions & Concurrency)
- ACID 強一致性:通過預寫日志(WAL, Write-Ahead Logging)保證數據持久化,崩潰恢復機制可靠。
- MVCC(多版本并發控制):默認隔離級別為?Read Committed,通過版本號實現無鎖讀,避免寫鎖阻塞讀操作,適合高并發場景(如電商訂單、實時分析)。
- 細粒度鎖控制:支持表級鎖、行級鎖(SELECT ... FOR UPDATE)和 advisory lock(自定義應用層鎖)。
(5)高度可擴展(Extensibility)
- 插件生態:通過 CREATE EXTENSION 機制快速集成功能,例如:
- PostGIS:空間數據處理,用于地圖服務、物流軌跡分析。
- pg_cron:定時任務調度,替代 Linux cron。
- Citus:分布式擴展,支持分庫分表,提升大數據量下的查詢性能。
- pg_stat_statements:SQL 性能分析,定位慢查詢。
- 自定義函數:支持 PL/pgSQL、Python、Java 等多語言編寫存儲過程,甚至動態加載 C 語言擴展。
- 存儲過程與觸發器:支持復雜業務邏輯下沉到數據庫層,減少應用層壓力。
(6)企業級安全性(Security)
- 認證機制:支持 LDAP、Kerberos、SCRAM-SHA-256 密碼認證,兼容多認證源(如 AWS IAM 數據庫認證)。
- 權限控制:基于角色(ROLE)的細粒度權限管理,支持表級、列級權限(如敏感字段隱藏)和行級安全策略(RLS, Row-Level Security),實現 “不同用戶看到不同數據”。
- 加密能力:
- 傳輸層:支持 SSL/TLS 加密連接,防止數據竊聽。
- 存儲層:通過 pgcrypto 擴展實現字段級加密,或集成云服務商的透明數據加密(TDE)。
- 審計日志:內置日志記錄功能,可追蹤 SQL 操作,滿足合規性要求(如 GDPR、等保 2.0)。
3. 優勢
-
高性能:PostgreSQL 通過優化查詢計劃、支持并行查詢、分區表等特性,提供卓越性能表現,即使處理大規模數據和高并發訪問時,也能保持高效響應速度。
-
高可用性:支持主從復制、流復制和邏輯復制等多種復制方式,使數據庫系統輕松實現高可用性和容災備份,故障時能快速恢復服務,確保業務連續性。
-
靈活性:豐富的數據類型和高級特性使其能靈活應對各種復雜業務場景,無論是結構化數據還是非結構化數據,都能提供強大支持。
-
社區支持:擁有活躍的開發者社區和豐富生態系統,社區中有大量教程、文檔和插件可供使用,眾多經驗豐富的開發者也愿意分享經驗、解答問題。
-
成本效益:作為開源軟件,降低了企業成本投入,其卓越性能和廣泛應用場景使其成為許多企業的首選數據庫產品。
4. 架構
邏輯層面包含數據庫集群、表空間、數據庫、Schema、表、索引等結構;
物理層面包括數據文件、日志文件、參數文件、控制文件等存儲方式,其中數據塊(Page)作為數據讀寫基本單位,在 PostgreSQL 中扮演關鍵角色。通過優化數據塊的讀寫效率和布局方式,PostgreSQL 能進一步提高性能表現。
5. 應用場景
-
企業應用:如ERP、CRM、HRM等系統,需要處理復雜的事務和查詢操作;postgresql憑借其高性能和事務處理能力,能夠為企業應用提供穩定可靠的數據支持。
-
數據分析:在數據倉庫和商業智能領域,PostgreSQL 憑借其豐富的數據類型和高級查詢特性,能夠輕松應對大規模數據分析和挖掘任務。
-
web 應用:對于需要高并發訪問和實時數據處理的 Web 應用來說,PostgreSQL 的 MVCC 機制和擴展性特性使得其成為了一個理想的選擇。
-
地理信息系統:通過 PostGIS 擴展,PostgreSQL 能夠支持地理空間數據的存儲和分析功能,為 GIS 應用提供了強大的數據支持。
-
物聯網與大數據:隨著物聯網和大數據技術的不斷發展,PostgreSQL 憑借其高性能、可擴展性和豐富的數據類型特性,在物聯網和大數據領域中也得到了廣泛的應用。
6. 結論
PostgreSQL 是一款功能強大、開源的數據庫管理系統,在信息化建設中發揮越來越重要的作用,其豐富的特性、卓越的性能、靈活的應用場景以及強大的社區支持使它成為了眾多企業與開發者的首選數據庫產品。
二、安裝PostgreSQL
1. 編譯安裝
(1)安裝編譯安裝所需環境
1.下載依賴包 dnf -y install gcc libicu libicu-devel readline-devel zlib zlib-devel
2. 解壓 tar zxvf
3. 切換進目錄
(2)編譯安裝
配置編譯 ./configure --prefix=/usr/local/pgsql
make && make install
(3)配置環境變量
5.創建用戶 useradd postgres
6.創建數據存儲目錄 mkdir /usr/local/pgsql/data
7.改目錄歸屬 chown -R postgres /usr/local/pgsql/data
8.配置環境變量 vim /etc/profile函數庫路徑 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/loacl/pgsql/lib命令路徑 export PATH=$PATH:/usr/local/pgsql/bin
9.刷新環境變量 source /etc/profile
查看 echo $PATH/LD_LIBRARY_PATH
(4)登錄數據庫
10.初始化
切換用戶 su - postgres
初始 /usr/local/pgsql/bin/initdb -D /usr/local/pgsql/data
11.啟動數據庫
啟動程序 /usr/local/pgsql/bin/pg_ctl -D /usr/local/pgsql/data -l logfile start
12.登錄
psql
三、PostgreSQL 結構
1. PG 的邏輯結構
-
集群(Cluster):
-
一個 PostgreSQL 服務實例對應一個集群,包含多個數據庫。
-
通過?
initdb
?初始化時創建,是物理數據存儲的頂層容器。
-
-
數據庫(Database):
-
集群內可創建多個數據庫,每個數據庫獨立(默認不共享數據)。
-
用戶通過?
CREATE DATABASE
?創建,不同數據庫通過名稱隔離。
-
-
模式(Schema):
-
每個數據庫包含多個模式(類似于命名空間),用于邏輯分組表、視圖等對象。
-
默認模式為?
public
,可通過?CREATE SCHEMA
?創建新模式
-
-
User 用戶:
-
postgres 用戶是默認創建的超級管理員;每個數據庫都有一個 OWNER 用戶,每個用戶可以 OWNER 多個數據庫。
-
-
數據庫對象:
-
包含 table、index、view、序列、函數等,數據最終存儲在表中。表由多個 page[block]組成,一個 page 包含(頁頭信息、空閑空間、Tuple),實際存儲數據的區域對應到物理層面上是文件,由 page 構成。
-
模式內包含具體對象,如表、視圖、索引、函數等。
-
對象通過?
<schema>.<object>
?格式引用(如?public.users
-
-
tablespace:存儲數據庫的一個邏輯空間,可以存放不同的數據庫,對應在物理層面上是一個目錄。
-
OID:所有數據庫對象都有各自的 oid(object identifiers),oid 是一個無符號的四字節整數,相關對象的 oid 存放在相關的 system catalog 表中,如數據庫的 oid 和表的 oid 分別存放在 pg_database、pg_class 表中。
- 總結:
(1)從大小排列:database cluster --> databases --> schema --> objects。
(2)Tablespace 是數據最大的存儲空間,Database 是構成表空間的存儲單元,pages 是 PostgreSQL 數據庫中最小的 IO 單元。
2. PG 的物理結構
(1)軟件安裝目錄
其中各個目錄里的內容及用途:
- bin:二進制可執行文件,是 PG 數據庫的所有相關命令所在,為方便使用需設置到環境變量中
- lib:動態庫目錄,PostgreSQL 運行所需要的動態庫都在此目錄下
- share:放有文檔和配置模板文件,一些拓展插件的 SQL 文件在此目錄下的 extension 中
- data:目錄是數據庫集群的物理存儲核心,包含用戶數據、元數據和配置文件
- include:目錄則提供編譯擴展和客戶端程序所需的 C 語言頭文件
(2)數據庫目錄結構
-bash - 4.2$ tree -L 1 -d /usr/local/pgsql/data/
/usr/local/pgsql/data/ —— 數據目錄├── base —— 表和索引文件存放目錄
├── global —— 影響全局的系統表存放目錄
├── pg_commit_ts —— 事務提交時間戳數據存放目錄
├── pg_dynshmem —— 被動態共享所使用的文件存放目錄
├── pg_logical —— 用于邏輯復制的狀態數據
├── pg_multixact —— 多事務狀態的數據
├── pg_notify —— LISTEN/NOTIFY 狀態的數據
├── pg_replslot —— 復制槽數據存放目錄
├── pg_serial —— 已提交的可序列化信息存放目錄
├── pg_snapshots —— 快照
├── pg_stat —— 統計信息
├── pg_stat_tmp —— 統計信息子系統臨時文件
├── pg_subtrans —— 子事務狀態數據
├── pg_tblspc —— 表空間
├── pg_twophase —— 預備事務狀態文件
├── pg_wal —— 事務日志(預寫日志)
└── pg_xact —— 日志提交狀態的數據存放目錄#是最小化系統,可以臨時安裝包管理器進行查看 yum install -y tree
#或手動解析成樹狀圖 find /usr/local/pgsql/data/ -type d | sed 's/[^-][^\/]*\//--/g; s/^/ /; s/\/$/|/'
#非樹狀 ls -R /usr/local/pgsql/data/ 通過 -R 參數遞歸顯示目錄層級
?文件和目錄相關作用描述
files | description |
---|---|
PG_VERSION | 包含 PostgreSQL 主版本號的文件 |
pg_hba.conf | 控制 PostgreSQL 客戶端驗證的文件,控制 PG 客戶端認證主機、數據庫、用戶、IP 地址 |
pg_ident.conf | 控制 PostgreSQL 用戶名映射的文件,配置操作系統用戶和數據庫服務器上的用戶映射 |
postgresql.conf | 配置參數文件 |
postgresql.auto.conf | 用于存儲在 ALTER SYSTEM(版本 9.4 及更高版本)中設置的配置參數的文件 |
postmaster.opts | 記錄服務器上一次啟動的命令行選項 |
subdirectories | description |
base/ | 包含每個數據庫子目錄的子目錄 |
global/ | 包含集群范圍表的子目錄,例如 pg_database 和 pg_control |
pg_commit_ts/ | 包含事務提交時間戳數據的子目錄。9.5 版本以后 |
clog / 或 pg_xact(9.6 及 earlier) | 包含事務提交狀態數據的子目錄,它在版本 10 中重命名為 pg_xact。CLOG 將在 5.4 章節中講解。 |
dynshmem/ | 包含動態共享內存子系統使用的文件的子目錄。9.4 版本以后 |
logical/ | 包含邏輯解碼的狀態數據的子目錄。9.4 版本以后 |
pg_multixact/ | 包含多事務狀態數據的目錄(用于共享行鎖) |
pg_notify/ | 包含 LISTEN/NOTIFY 狀態數據的子目錄 |
pg_replslot/ | 包含復制槽數據的子目錄(9.4 版本以后) |
pg_serial/ | 包含已提交的可序列化事務信息(9.1 版本以后)信息的子目錄 |
pg_snapshots/ | 包含導出快照的子目錄(9.2 版本以后)。PostgreSQL 的函數 pg_export_snapshot 在此子目錄中創建快照信息文件 |
pg_stat/ | 包含統計子系統永久文件的子目錄 |
pg_stat_tmp/ | 包含統計子系統臨時文件的子目錄 |
pg_subtrans/ | 包含子事務狀態數據的子目錄 |
pg_tblspc/ | 表空間符號鏈接目錄 |
pg_twophase/ | 包含 prepare 事務的狀態文件 |
pg_wal/(Version 10 or later) | 包含 WAL(Write Ahead Logging)段文件的子目錄。在版本 10 中從 pg_xlog 重命名而來。 |
pg_xact/(Version 10 or later) | 包含事務提交狀態數據的子目錄。在版本 10 中從 pg_clog 重命名而來。CLOG 將在 5.4 章節中詳解。 |
pg_xlog/(Version 9.6 or earlier) | 包含 WAL(Write Ahead Logging)段文件的子目錄。在版本 10 中重命名為 pg_wal。 |
(3)數據庫有兩個基礎的對象,一個是oid, 一個是表空間
-
OID(Object Identifier):
-
每個數據庫對象(如表、索引)分配唯一的 32 位整數標識符。
-
系統表(如?
pg_class
)記錄 OID 與對象名的映射。
-- 查看表的 OID SELECT oid, relname FROM pg_class WHERE relname = 'users';
-
-
表空間(Tablespace):
-
定義數據文件的存儲路徑,允許將數據分散到不同磁盤。
-
默認表空間:
-
pg_default
:存儲用戶數據(對應?base
?目錄)。 -
pg_global
:存儲集群級系統表(對應?global
?目錄)。
-
-
(4)base 的物理布局設計
-
base
?目錄:-
每個數據庫在?
base
?下有一個以數據庫 OID 命名的子目錄。 -
示例:數據庫 OID 為?
16384
?→ 目錄為?base/16384
。
-
-
數據文件:
-
每個表或索引對應一個或多個文件(文件名為?
relfilenode
?值)。 -
文件命名規則:
<relfilenode>
(如?12345
)。 -
大表可能被拆分為多個文件(如?
12345.1
,?12345.2
)。
-
(5)表空間跟數據庫關系
- 在 Oracle 數據庫中:一個表空間只屬于一個數據庫使用,而一個數據庫可以擁有多個表空間,屬于 “一對多” 的關系。
- 在 PostgreSQL 集群中:一個表空間可以讓多個數據庫使用,而一個數據庫可以使用多個表空間,屬于 “多對多” 的關系。
??? 系統自帶表空間:
- 表空間 pg_default 是用來存儲系統目錄對象、用戶表、用戶表 index、臨時表、臨時表 index、內部臨時表的默認空間,對應存儲目錄 $PGDATA/base/。
- 表空間 pg_global 用來存放系統字典表,對應存儲目錄 $PGDATA/global/。