目录
一:PostgreSQL
1:简介
PostgreSQL 是一款开源的关系型数据库管理系统(RDBMS),起源于 1986 年加州大学伯克利分校的 POSTGRES 项目。它遵循 SQL 标准,支持复杂查询、事务处理和多种数据类型,以高扩展性和可靠性著称,被广泛用于企业级应用。
2:特点
- 开源与自由:基于宽松的 BSD 许可证,允许用户自由使用、修改和分发代码,无商业使用限制。由全球开发者共同维护,确保功能迭代快速且透明,避免了厂商锁定风险。
- 标准符合性:支持 SQL:2016 等核心规范,兼容窗口函数、CTE(公共表表达式)、JSON 操作等高级语法。提供与 Oracle、MySQL 等数据库的语法兼容模式(如 PL/pgSQL 类似 Oracle 的 PL/SQL),降低迁移成本。
- 数据类型丰富:除基础类型外,支持数组、JSON/JSONB、XML、几何类型(PostGIS 扩展)、范围类型、UUID 等。
- 事务与并发:ACID 事务支持:确保原子性、一致性、隔离性、持久性。
- 扩展性:通过扩展(Extensions)轻松增强功能
- 安全性:支持 SELinux 集成(SE-PostgreSQL)强化操作系统级安全。
3:优势
- 高性能:读写操作互不阻塞,支持高并发场景。提供 B-tree、GIN(全文检索)、GiST(空间数据)、BRIN(大范围数据)等索引类型,优化查询性能。支持多核并行执行(如聚合、扫描、JOIN 操作),加速复杂查询(9.6+ 版本)。
- 高可用性:支持异步/同步数据复制,保障数据冗余与一致性。通过工具(如 Patroni、Repmgr)实现主从切换,最小化停机时间。基于 WAL 日志的精准数据恢复,避免数据丢失。
- 灵活性:集成 PostGIS(地理空间)、TimescaleDB(时序数据)、Citus(分布式表)等扩展,按需增强功能。兼容关系型、JSON/JSONB(文档)、键值(HStore)、图数据(Apache AGE)等模型。
- 社区支持:全球开发者与公司(如 AWS、Microsoft、EDB)共同推动功能迭代与问题修复。提供官方手册、教程、Stack Overflow 问答及年度全球会议(PgConf)。AWS RDS/Aurora、Azure Database 等主流云平台提供托管服务,降低运维复杂度。
- 成本效益:基于 BSD 许可证,无商业使用限制,节省数百万美元级商业数据库授权成本。高效利用普通服务器资源,支持横向扩展(如分片集群),减少硬件投入。
4:架构
-
进程模型:采用多进程架构,每个客户端连接分配独立进程(通过连接池优化资源)。
-
存储结构:
-
表空间:支持自定义数据存储路径。
-
堆表文件:数据以堆表形式存储,支持 TOAST 技术处理大字段。
-
-
内存管理:
-
共享缓冲区:缓存常用数据页,减少磁盘 I/O。
-
WAL(预写日志):确保事务持久性和崩溃恢复。
-
-
查询处理:解析器→优化器(基于代价优化)→执行器。
5:应用场景
-
OLTP 系统:高并发事务处理(如金融交易、电商订单)。
-
OLAP 分析:通过并行查询和扩展插件支持复杂分析(如 Citus 实现分布式分析)。
-
地理信息系统(GIS):结合 PostGIS 处理空间数据(如地图服务)。
-
文档存储:利用 JSONB 类型高效存储和查询半结构化数据。
-
时序数据:通过 TimescaleDB 扩展支持物联网、监控场景。
-
混合负载:同时处理事务与分析(HTAP)。
6:结论
二:安装PostgreSQL
1:编译安装
(1)安装编译
yum -y install gcc libicu libicu-devel readline-devel zlib zlib-devel
(2)解压源码包
tar zxvf postgresql-16.3.tar.gz
cd postgresql-16.3
./configure --prefix=/usr/local/pgsql
make && make install
(3)配置环境
#创建用户
useradd postgres
mkdir /usr/local/pgsql/data
chown -R postgres /usr/local/pgsql/data
(4)配置环境变量
vim /etc/profile
export PATH=$PATH:/usr/local/pgsql/lib
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/pgsql/lib
#刷新环境变量
source /etc/profile
echo $PATH
echo $LD_LIBRARY_PATH
(5)登录数据库
#初始化数据
su - postgres
/usr/local/pgsql/bin/initdb -D /usr/local/pgsql/data/
/usr/local/pgsql/bin/pg_ctl -D /usr/local/pgsql/data/ -l logfile start
登录数据库:psql
2:dnf安装
dnf -y install postgresql-server
#初始化数据库
postgresql-setup --initdb
pg_ctl start
登录数据库:psql
su - postgres
三:PostgreSQL结构
1:PG的逻辑结构
数据库集簇(database cluster)
-
定义:由单个PostgreSQL服务器实例管理的所有数据库的集合,并非“多台服务器的集群”。
-
初始化:通过
initdb
命令创建,生成一个数据目录(如PGDATA
),包含全局配置和模板数据库。 -
关键点:一个实例仅管理一个数据库集簇,不同集簇需启动不同实例。
数据库
-
作用:数据存储的顶层逻辑单元,用户需连接特定数据库进行操作。
-
独立性:数据库间默认隔离(无法跨库查询),通过
dblink
或FDW
实现跨库访问。 -
模板数据库:
template0
和template1
用于创建新数据库。
Schema(模式)
-
层级:位于数据库内部,用于组织表、视图、函数等对象。
-
权限控制:可通过模式实现对象分组权限管理(如
GRANT USAGE ON SCHEMA schema1 TO user1;
)。 -
默认模式:
public
,若未指定则对象默认创建于此。
user用户
-
关系:用户是具有登录权限的角色,角色用于权限继承和分组。
-
权限体系:通过
GRANT/REVOKE
管理对象权限,角色可继承其他角色权限。
tablespace
-
功能:定义数据库对象的物理存储位置,允许将数据分散到不同磁盘。
-
使用场景:优化I/O性能(如将频繁访问的表放到SSD),或管理存储空间。
-
与目录关系:表空间映射到文件系统目录,通过
pg_tblspc
子目录的符号链接实现。
OID
-
用途:系统内部唯一标识对象(如数据库、表、索引等)。
-
可见性:默认隐藏,可通过查询系统表(如
pg_database
或pg_class
)查看。 -
存储方式:32位无符号整数,可能在新版本中被更长的标识符替代。
2:PG的物理结构
(1)软件安装目录
-
路径示例:
-
Linux:
/usr/lib/postgresql/14/bin
(二进制文件)、/usr/share/postgresql/14
(脚本)
-
-
关键内容:可执行文件(如
postgres
服务进程)、工具(如pg_ctl
)、头文件等。
(2)数据库目录结构
-
核心子目录:
-
base/
:默认表空间下各数据库的数据文件。 -
global/
:存储集簇全局表(如pg_database
、pg_authid
)。 -
pg_tblspc/
:表空间的符号链接(指向自定义表空间路径)。 -
pg_wal/
:预写日志(WAL)文件,用于崩溃恢复。 -
pg_xact/
:事务提交状态数据。
-
-
配置文件:
postgresql.conf
(主配置)、pg_hba.conf
(客户端认证)、pg_ident.conf
(用户名映射)。
(3)数据库有两个基础的对象 一个是oid,一个是表空间
-
OID物理体现:数据库目录名(如
base/12345
,其中12345
是数据库OID)、文件名(如12345
表示表的OID)。 -
表空间路径:通过
CREATE TABLESPACE
指定路径后,在pg_tblspc/
下生成符号链接(如pg_tblspc/67890 -> /mnt/ssd_data
)。
(4)base的物理布局设计
-
结构:每个数据库对应一个以OID命名的子目录,包含:
-
数据文件:每个表或索引对应一个或多个文件(如
12345.1
)。 -
空闲空间映射文件(
_fsm
)、可见性映射文件(_vm
)。
-
-
文件名规则:
${OID}_${fork}
,fork
表示文件类型(如主文件无后缀,_init
为初始化分支)。
(5)表空间跟数据库关系
-
多对多关系:
-
一个表空间可被多个数据库使用(如
db1
和db2
均可将表存放到表空间ssd_space
)。 -
一个数据库可使用多个表空间(如
db1
的表分布在ssd_space
和hdd_space
)。
-
系统自带表空间:
表空间pg_default是用来存储系统目录对象,用户表,用户表index,和临时表,临时表index,内部临时表的默认空间。对应存储目录$PADATA/base/
表空间pg_global用来存放系统字典表;对应存储目录$PADATA/global/