PostgreSQL 数据库
PostgreSQL(简称 Postgres)是一款功能强大的开源对象关系型数据库管理系统 (ORDBMS) ,被誉为 "世界上最先进的开源关系数据库"。它起源于 1986 年加州大学伯克利分校的 Ingres 项目,1996 年正式更名为 PostgreSQL,以其严格遵循 SQL 标准、丰富的数据类型、强大的扩展性和高可靠性而闻名。
一、核心架构与组件
1.1 进程模式(多进程架构)
PostgreSQL 采用经典的多进程模式,而非 MySQL 的多线程模式:
| 进程类型 | 作用 |
|---|---|
| postmaster(主进程) | 负责监听客户端连接、启动 / 管理子进程、处理数据库启停、故障恢复 |
| backend process(后端进程) | 每个客户端连接对应一个,执行 SQL 语句、返回结果,进程间相互独立 |
| 辅助进程 | - bgwriter :后台写进程,将共享缓冲区脏数据异步写入磁盘 - walwriter :预写日志写进程,保障事务 ACID - checkpointer :检查点进程,减少崩溃恢复时间 - autovacuum:自动清理进程,回收死元组、更新统计信息 |
1.2 存储结构
PostgreSQL 存储分为逻辑存储 和物理存储两层:
逻辑存储层次
数据库集群(Database Cluster)→ 数据库(Database)→ 模式(Schema)→ 表空间(Tablespace)→ 数据库对象(表、索引、视图等)
物理存储特点
- 数据以块(block)为单位 存储,默认 8KB,可配置为 16KB/32KB
- 表数据按堆文件(Heap File)组织,每行数据有唯一CTID标识位置
- 索引默认采用B+树结构,支持多种索引类型(哈希、GiST、GIN 等)
- WAL(Write-Ahead Logging):预写日志机制,确保事务持久性,支持时间点恢复
二、核心特点与优势
2.1 数据类型
PostgreSQL 支持极其丰富的数据类型,远超 MySQL 等传统数据库:
| 类型类别 | 具体类型 | 应用场景 |
|---|---|---|
| 基础类型 | 数值(int2/int4/int8/numeric)、字符串(varchar/text)、日期时间、布尔 | 通用业务数据 |
| 高级类型 | - 数组 :原生支持一维 / 多维数组,可直接进行数组运算 - JSON/JSONB :JSONB 为二进制存储,支持索引,查询性能优异 - 范围类型 :int4range、daterange 等,适合存储区间数据 - 枚举类型 :自定义枚举值,限制输入合法性 - UUID :全球唯一标识符 - 几何类型:点、线、面等,支持空间运算 | 半结构化数据、空间数据、复杂业务逻辑 |
| 扩展类型 | 通过 PostGIS 扩展支持 GIS 地理信息、TimescaleDB 支持时序数据、Citus 支持分布式数据库 | 特定领域应用 |
2.2 事务与并发控制
- ACID 完全支持:原子性、一致性、隔离性、持久性
- MVCC(多版本并发控制):读写操作完全并行,通过版本号实现无锁读,大幅降低锁等待时间
- 隔离级别 :支持 SQL 标准的 4 个隔离级别,额外提供可序列化快照隔离(SSI),解决读写冲突问题
2.3 强大的扩展性
PostgreSQL 的扩展性是其最核心优势之一:
-
自定义对象 :用户可定义数据类型、函数、操作符、聚合函数、索引等
-
扩展机制 :通过
CREATE EXTENSION轻松安装功能扩展,如:-
pg_trgm:支持 trigram 文本相似度搜索 -
pg_stat_statements:SQL 执行统计分析 -
postgis:地理信息处理
-
-
语言支持 :内置支持PL/pgSQL(类 Oracle PL/SQL),还支持 Python、Perl、Tcl、JavaScript 等多种编程语言编写存储过程
2.4 与 MySQL 对比核心差异
| 特性 | PostgreSQL | MySQL |
|---|---|---|
| SQL 标准兼容性 | 极高(支持 SQL:2016 大部分特性) | 中等(有较多非标准扩展) |
| 数据类型 | 极其丰富(数组、JSONB、范围、几何等) | 基础类型为主 |
| 事务隔离 | 支持 SSI 级别,MVCC 实现更完善 | 支持 4 个标准级别 |
| 锁机制 | 细粒度锁,读写并行性好 | InnoDB 行锁,但间隙锁问题突出 |
| 扩展性 | 强大(自定义类型、函数、扩展) | 较弱 |
| 开源协议 | BSD 协议(商业友好,无需开源衍生作品) | GPL 协议(商业使用受限) |
| 适用场景 | 复杂查询、数据分析、GIS、金融级应用 | Web 应用、简单查询、读多写少场景 |
三、安装与基础配置
3.1 安装步骤
bash
# 安装官方 YUM 源(20.03/22.03)
dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-8-x86_64/pgdg-redhat-repo-latest.noarch.rpm
# 安装服务端
dnf install -y postgresql14-server postgresql14-contrib
# 手动初始化并启动
/usr/pgsql-14/bin/postgresql-14-setup initdb
systemctl enable postgresql-14
systemctl start postgresql-14
systemctl status postgresql-14
3.2 目录与配置文件位置
数据目录:/var/lib/pgsql/14/data/
主配置: /var/lib/pgsql/14/data/postgresql.conf
认证配置:/var/lib/pgsql/14/data/pg_hba.conf
命令路径:/usr/pgsql-14/bin/psql
3.3 基础安全配置
修改 postgres 系统用户密码
bash
passwd postgres
进入 PostgreSQL 命令行并设置 DB 密码
bash
su - postgres
psql
sql
ALTER USER postgres WITH PASSWORD '你的强密码';
\q
3.4 允许远程连接(生产 / 局域网常用)
修改 postgresql.conf 监听所有 IP
bash
vi /var/lib/pgsql/14/data/postgresql.conf
修改:
ini
listen_addresses = '*'
port = 5432
修改 pg_hba.conf 允许网段访问
bash
vi /var/lib/pgsql/14/data/pg_hba.conf
末尾加(示例允许局域网):
ini
host all all 192.168.0.0/24 scram-sha-256
# 或测试用(不推荐生产) 0.0.0.0/0
重启生效
bash
systemctl restart postgresql-14
四、基础操作与常用命令
4.1 psql 命令行工具
| 操作 | 命令 |
|---|---|
| 连接数据库 | psql -h <host> -U <user> -d <dbname> -p <port> |
| 查看数据库列表 | \l |
| 切换数据库 | \c <dbname> |
| 查看表结构 | \d <table> |
| 查看索引 | \di |
| 查看函数 | \df |
| 执行外部 SQL 文件 | \i <filename.sql> |
| 退出 psql | \q |
4.2 常用 SQL 操作
创建数据库和表
sql
-- 创建数据库
CREATE DATABASE mydb WITH ENCODING 'UTF8' LC_COLLATE 'en_US.UTF-8' LC_CTYPE 'en_US.UTF-8';
-- 创建表(含约束)
CREATE TABLE users (
id SERIAL PRIMARY KEY, -- 自增主键
name VARCHAR(50) NOT NULL,
email VARCHAR(100) UNIQUE NOT NULL,
age INT CHECK (age > 0),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 创建索引
CREATE INDEX idx_users_email ON users(email);
数据操作
sql
-- 插入数据
INSERT INTO users (name, email, age) VALUES ('张三', 'zhangsan@example.com', 25);
-- 查询数据(支持复杂条件)
SELECT * FROM users WHERE age > 20 ORDER BY created_at DESC LIMIT 10;
-- 更新数据
UPDATE users SET age = 26 WHERE id = 1;
-- 删除数据
DELETE FROM users WHERE id = 1;
五、高级功能深度解析
5.1 窗口函数(Window Functions)
PostgreSQL 支持完整的窗口函数,用于复杂数据分析,无需自连接或子查询:
sql
-- 计算每个部门员工的薪资排名
SELECT
name, department, salary,
RANK() OVER (PARTITION BY department ORDER BY salary DESC) AS rank,
AVG(salary) OVER (PARTITION BY department) AS dept_avg
FROM employees;
5.2 JSON/JSONB 操作
PostgreSQL 对 JSON 的支持远超 MySQL ,特别是JSONB类型(二进制存储,支持索引):
sql
-- 创建含JSONB字段的表
CREATE TABLE products (
id SERIAL PRIMARY KEY,
data JSONB NOT NULL
);
-- 插入JSON数据
INSERT INTO products (data) VALUES (
'{"name": "iPhone 15", "price": 7999, "tags": ["apple", "phone"]}'
);
-- JSONB查询(支持索引加速)
SELECT data->>'name' AS name, data->>'price' AS price
FROM products
WHERE data @> '{"tags": ["phone"]}'; -- 包含指定标签
5.3 全文检索
PostgreSQL 内置全文检索功能,无需依赖外部搜索引擎:
sql
-- 创建全文索引
CREATE INDEX idx_articles_content ON articles USING gin(to_tsvector('english', content));
-- 全文检索查询
SELECT title, content
FROM articles
WHERE to_tsvector('english', content) @@ to_tsquery('english', 'PostgreSQL & database');
六、性能优化指南
6.1 关键配置参数调优
| 参数 | 建议值 | 作用 |
|---|---|---|
| shared_buffers | 系统内存的25%-40% | PostgreSQL 自身缓存,减少磁盘 IO |
| work_mem | 4MB-64MB(根据业务调整) | 排序、哈希操作内存,影响复杂查询性能 |
| maintenance_work_mem | 64MB-1GB | 索引创建、VACUUM 等维护操作内存 |
| effective_cache_size | 系统内存的50%-75% | 查询优化器估算可用缓存大小,影响执行计划选择 |
| wal_buffers | 32MB-128MB | WAL 缓冲区大小,提升写性能 |
6.2 索引优化策略
PostgreSQL 支持多种索引类型,按需选择:
| 索引类型 | 适用场景 |
|---|---|
| B + 树(默认) | 等值查询、范围查询、排序操作 |
| GiST | 空间数据(PostGIS)、全文检索、模糊查询 |
| GIN | JSONB、数组、全文检索(多值查询) |
| BRIN | 大数据量、有序数据(如时间序列),空间占用小 |
索引优化原则:
- 最常用查询条件放在复合索引最左侧
- 选择性高的列优先作为索引列
- 避免过度索引(写入操作会维护所有索引)
- 定期使用
REINDEX重建碎片化索引
6.3 日常维护命令
sql
-- 更新统计信息(帮助查询优化器生成最优计划)
ANALYZE VERBOSE users;
-- 真空清理(回收死元组,防止表膨胀)
VACUUM ANALYZE users; -- 普通清理并分析
VACUUM FULL users; -- 彻底清理(锁表,谨慎使用)
-- 分析查询执行计划
EXPLAIN ANALYZE SELECT * FROM users WHERE email = 'zhangsan@example.com';
-- 查看慢查询
SELECT * FROM pg_stat_statements ORDER BY total_time DESC LIMIT 10;
七、备份与恢复
7.1 物理备份(pg_basebackup)
适合全量备份,速度快,恢复时间短:
bash
# 创建基础备份
pg_basebackup -h 127.0.0.1 -U postgres -D /backup/pg_base -F t -X stream -P
# 恢复(停止PostgreSQL后)
rm -rf /var/lib/postgresql/17/main/*
tar -xzf /backup/pg_base.tar.gz -C /var/lib/postgresql/17/main
7.2 逻辑备份(pg_dump/pg_dumpall)
适合部分备份 或跨版本迁移,备份结果为 SQL 文件:
bash
# 备份单个数据库
pg_dump -h 127.0.0.1 -U postgres -d mydb -F c -f /backup/mydb.dump
# 备份所有数据库
pg_dumpall -h 127.0.0.1 -U postgres -f /backup/all_databases.sql
# 恢复数据库
pg_restore -h 127.0.0.1 -U postgres -d mydb /backup/mydb.dump
7.3 时间点恢复(PITR)
结合基础备份 + WAL 日志,可恢复到任意时间点:
-
配置
postgresql.conf启用归档:wal_level = replica archive_mode = on archive_command = 'cp %p /archive/%f' -
进行基础备份
-
恢复时指定恢复目标时间:
recovery_target_time = '2026-04-03 12:00:00'