PostgreSQL 二进制安装实战:从零搭建生产级数据库(含运维命令与SQL速查)
前言
PostgreSQL(简称 PG)号称"世界上最先进的开源关系型数据库",在以下场景里几乎是无可争议的首选:
- 地理空间数据(PostGIS 扩展,吊打 MySQL)
- JSON/JSONB 半结构化数据(比 MySQL 的 JSON 强至少 3 倍)
- 复杂查询 / 数据分析(优化器极强)
- 金融级严格事务(SQL 标准遵循度最高)
- 海量数据 + 高并发写入(CynosDB、TiDB 都有 PG 的影子)
但 PostgreSQL 的安装对新手不太友好——尤其是二进制方式,跟 MySQL 的"tar 一解压就跑"思路不一样。
为什么选二进制安装?
| 方式 | 优缺点 |
|---|---|
| yum/apt | 版本受发行版限制;依赖多;卸载麻烦 |
| 源码编译 | 灵活可定制,但编译时间 30 分钟+,报错排查困难 |
| 二进制 | ✅ 官方提供(EDB);预编译好;解压即用;路径统一 |
本文用 EDB 提供的 PostgreSQL 16 二进制包作为演示(也是 PostgreSQL 官方推荐的方式),覆盖:
- 二进制安装(解压→建用户→初始化→配置)
- systemd 服务化
- 远程连接 + 用户管理
- 运维常用命令
- SQL 实战(CRUD + 高级特性)
- 流复制(主备)
- 备份恢复(pg_dump / pg_basebackup / WAL归档)
一、安装前准备
1.1 下载二进制包
EDB 官方下载地址:https://www.enterprisedb.com/download-postgresql-binaries
|
|
也可以从 PostgreSQL 官网(https://www.postgresql.org/download/linux/)选 “Linux x86-64” → “Binary Installer” 跳转。
为什么不从源码编译? 编译 PG 主要为了加扩展(比如 PostGIS),普通安装直接用二进制又快又稳。
1.2 系统环境检查
|
|
1.3 创建 postgres 用户和目录
|
|
1.4 清理旧环境
|
|
二、正式安装
2.1 解压安装包
|
|
目录结构说明:
|
|
2.2 配置环境变量
|
|
2.3 初始化数据库集群
核心步骤:initdb 命令会生成一个全新的数据库集群(PG 中"一个集群 = 一套数据库 + 一套配置 + 一个端口")。
|
|
关键区别(vs MySQL):
- PG 的"数据库集群"(database cluster)= PG 服务的整个实例
- MySQL 的"实例"= 一个 mysqld 进程
- PG 一个端口服务可以有多个 database(db1、db2、db3…),但都属于同一个集群
PG 早期版本(10 以下)叫
initdb之前要用postgres用户;10+ 直接initdb即可。
2.4 配置监听和远程连接
|
|
配置 pg_hba.conf(客户端认证):
|
|
认证方式速查:
trust:无条件放行(仅本地测试用)md5:MD5加密密码(兼容老客户端)scram-sha-256:更安全的密码加密(PG 10+ 默认推荐)peer:操作系统用户必须同名(仅 local)
2.5 启动 PostgreSQL
|
|
2.6 配置 systemd 服务(生产推荐)
|
|
2.7 首次登录配置
|
|
2.8 防火墙和远程连接
|
|
三、用户与权限管理(PG 跟 MySQL 差很多)
PG 的权限体系比 MySQL 复杂得多,但更精细。
3.1 角色(Role)的概念
关键认知:PG 里没有"用户"和"组"的区别,统一叫角色(role):
|
|
3.2 权限层级
PG 的权限分多级:
| 层级 | 例子 | SQL 操作 |
|---|---|---|
| 数据库 | GRANT ALL ON DATABASE x |
CREATE, CONNECT, TEMPORARY |
| 模式 | GRANT ON SCHEMA x |
USAGE, CREATE |
| 表 | GRANT ON TABLE x |
SELECT, INSERT, UPDATE, DELETE, TRUNCATE |
| 列 | GRANT (col) ON TABLE x |
SELECT(col), UPDATE(col) |
| 序列 | GRANT ON SEQUENCE x |
USAGE, SELECT, UPDATE |
| 函数 | GRANT ON FUNCTION x |
EXECUTE |
3.3 实战:完整权限配置
|
|
3.4 常用 psql 命令(终端内)
|
|
四、运维常用命令(生产必备)
4.1 服务管理
|
|
4.2 连接与查询
|
|
4.3 数据库与表空间
|
|
4.4 慢查询分析
|
|
4.5 备份与恢复
pg_dump(逻辑备份)
|
|
pg_basebackup(物理备份,重要!)
|
|
WAL归档 + PITR(时间点恢复)
|
|
五、流复制(主备架构)
PG 16 的流复制非常成熟,是生产环境标配。
5.1 主库配置
|
|
|
|
|
|
5.2 备库搭建
|
|
5.3 验证复制状态
|
|
5.4 主备切换(switchover)
|
|
六、SQL 实战速查(从入门到精通)
6.1 DDL(数据定义)
|
|
6.2 DML(数据操作)
|
|
6.3 JSONB 查询(PG 的王牌)
|
|
6.4 索引大全
|
|
6.5 视图、函数、存储过程
|
|
6.6 事务控制
|
|
七、PostgreSQL 杀手锏特性(MySQL 没有的)
7.1 JSONB(吊打 MySQL JSON)
|
|
7.2 数组类型
|
|
7.3 全文检索(内置)
|
|
7.4 upsert(ON CONFLICT)
|
|
7.5 LISTEN / NOTIFY(实时通知)
|
|
八、避坑指南(生产血泪总结)
| 坑 | 现象 | 解决方案 |
|---|---|---|
initdb 用 root 跑 |
initdb: cannot run as root |
切换 su - postgres |
| pg_hba.conf 没改 | 远程连不上 | 改 host all all 0.0.0.0/0 md5 |
listen_addresses 没改 |
只监听 127.0.0.1 | listen_addresses = '*' |
WAL 没开 archive_mode |
没法做 PITR | archive_mode = on + archive_command |
| 防火墙没开 5432 | 远程连不上 | firewall-cmd --add-port=5432/tcp |
| 用 root 启动 postgres | 报权限错 | 必须用 postgres 用户 |
删库直接 rm -rf |
数据丢失 | DROP DATABASE 或 pg_dump 先备 |
SELECT * 不带 LIMIT |
大表 OOM | 加 LIMIT |
不用 BIGSERIAL |
int4 序列号用完 | 业务大表用 BIGSERIAL(int8) |
| jsonb 字段不加 GIN 索引 | 查询全表扫 | JSONB 必加 GIN |
VACUUM 长期不跑 |
表膨胀、查询变慢 | 配 autovacuum = on |
| 时区不统一 | 时间混乱 | 用 TIMESTAMPTZ,统一 UTC |
| 字符串函数编码不匹配 | 编码错误 | 库用 UTF8,客户端用 client_encoding = UTF8 |
没设 shared_buffers |
性能差 | 设为物理内存的 25% |
忘记 pg_stat_statements 扩展 |
没法做慢查询分析 | 安装 + 配置 shared_preload_libraries |
九、常用配置参数速查
|
|
十、常用 SQL 速查
|
|
总结
| 步骤 | 关键命令 | ||
|---|---|---|---|
| 下载 | EDB 官方二进制包 postgresql-XX-linux-x64-binaries.tar.gz |
||
| 解压 | tar -xvf xxx.tar.gz,移动到 /opt/postgresql |
||
| 建用户 | useradd -u 999 -g postgres -d /home/postgres postgres |
||
| 初始化 | initdb -E UTF8 --locale=C -U postgres -W |
||
| 启停 | `systemctl {start | stop | restart} postgresql` |
| 远程 | listen_addresses='*' + 改 pg_hba.conf |
||
| 备份 | pg_dump / pg_basebackup |
||
| 恢复 | pg_restore / PITR |
||
| 主从 | pg_basebackup -R |
||
| 工具链 | psql、pg_dump、pg_basebackup、pgAdmin 4 |
最后一条建议:
PG 的精髓在 SQL 本身。MySQL 是"够用就行",PG 是"想得到的都能写"。
当你用 JSONB、数组、窗口函数、CTE 写出优雅查询时,你才会真正爱上 PostgreSQL。
附录:MySQL ↔ PostgreSQL 速查对比
| 概念 | MySQL | PostgreSQL |
|---|---|---|
| 端口 | 3306 | 5432 |
| 命令行 | mysql |
psql |
| 超级用户 | root |
postgres |
| 自增类型 | AUTO_INCREMENT |
SERIAL / BIGSERIAL |
| 当前时间 | NOW() |
NOW() / CURRENT_TIMESTAMP |
| JSON | JSON(文本) |
JSON / JSONB(二进制) |
| 布尔 | TINYINT(1) / BOOLEAN |
BOOLEAN(原生) |
| 数组 | ❌ | ✅ TEXT[] 等 |
| 数组查询 | JOIN 表 | tag = ANY(ARRAY['x','y']) |
| upsert | INSERT ... ON DUPLICATE KEY UPDATE |
INSERT ... ON CONFLICT DO UPDATE |
| 全文检索 | 需配置 | 内置 |
| 物化视图 | ❌ | ✅ |
| 窗口函数 | 8.0+ | 长期支持,更强大 |
| CTE | 8.0+ | 长期支持,WITH RECURSIVE |
| PITR | binlog 时间点 | WAL 归档 + recovery.signal |
| 主从 | binlog 复制 | 流复制(WAL) |
| 用户管理 | CREATE USER |
CREATE ROLE ... LOGIN |
| 默认端口外的DB | database |
database + schema |
上一篇:《MySQL 8.0 二进制安装实战》(同系列)
下一篇预告:《MySQL ↔ PostgreSQL 数据迁移实战:从 schema 设计到 SQL 改写》
如果觉得有用,点赞 + 收藏 + 关注,是我继续肝下去的最大动力!
版权声明:本文采用 CC BY-NC-SA 4.0 协议,转载请保留作者及原文链接。