PostgreSQL 数据库

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 的扩展性是其最核心优势之一:

  1. 自定义对象 :用户可定义数据类型、函数、操作符、聚合函数、索引

  2. 扩展机制 :通过CREATE EXTENSION轻松安装功能扩展,如:

    • pg_trgm:支持 trigram 文本相似度搜索

    • pg_stat_statements:SQL 执行统计分析

    • postgis:地理信息处理

  3. 语言支持 :内置支持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 大数据量、有序数据(如时间序列),空间占用小

索引优化原则

  1. 最常用查询条件放在复合索引最左侧
  2. 选择性高的列优先作为索引列
  3. 避免过度索引(写入操作会维护所有索引)
  4. 定期使用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 日志,可恢复到任意时间点:

  1. 配置postgresql.conf启用归档:

    复制代码
    wal_level = replica
    archive_mode = on
    archive_command = 'cp %p /archive/%f'
  2. 进行基础备份

  3. 恢复时指定恢复目标时间:

    复制代码
    recovery_target_time = '2026-04-03 12:00:00'
相关推荐
墨着染霜华2 小时前
MySQL 重复数据删除语句
数据库·mysql
wgzrmlrm742 小时前
如何解决ORA-28040没有匹配的验证协议_sqlnet.ora版本兼容设置
jvm·数据库·python
一江寒逸2 小时前
零基础从入门到精通MySQL(附加篇):面试八股文全集
数据库·mysql·面试
数厘3 小时前
2.6MySQL库表操作指南(电商数据分析专用)
数据库·mysql·数据分析
需要点灵感3 小时前
SQL Server 存储过程语法整理
数据库·sql
刘~浪地球3 小时前
数据库与缓存--分库分表实战指南
网络·数据库·缓存
Mr_Xuhhh3 小时前
深入Java多线程进阶:从锁策略到并发工具全解析
前端·数据库·python
数厘3 小时前
2.5可视化工具与 MySQL 连接配置及基础操作
数据库·mysql
沃尔威武3 小时前
性能调优实战:从火焰图定位到SQL优化的全流程
android·数据库·sql