在上一篇文章中,我们理解了 PostgreSQL 的设计哲学和适用场景。现在,是时候把它跑起来了。但安装 PostgreSQL 不只是"装一个软件"那么简单------initdb 的每一个参数、postgresql.conf 的每一项配置、psql 的每一个快捷命令,都会直接影响你未来几年的开发体验和系统稳定性。一个在安装时选错编码的数据库,可能在存储了几个月中文数据后才发现排序异常;一个没有调优 shared_buffers 的实例,可能在流量上来后把所有查询都压到磁盘上。 本文从安装讲起,覆盖 initdb 初始化的关键决策、postgresql.conf 的核心参数、pg_hba.conf 的认证配置,以及 psql 日常高效操作的完整清单。跟着操作,30 分钟内拥有一个配置合理的 PostgreSQL 环境。
一、安装:四条路径,按场景选择
PostgreSQL 的安装方式取决于你的环境和运维偏好:

1.1 CentOS/RHEL 通过官方源安装(推荐)
使用 PostgreSQL 官方 YUM 源,可以安装最新稳定版本:
bash
# CentOS 7
sudo yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
# CentOS 8 / RHEL 8+
sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-8-x86_64/pgdg-redhat-repo-latest.noarch.rpm
# 安装 PostgreSQL 15 服务端和客户端
sudo dnf install -y postgresql15-server postgresql15
初始化并启动:
bash
sudo /usr/pgsql-15/bin/postgresql-15-setup initdb
sudo systemctl enable postgresql-15
sudo systemctl start postgresql-15
sudo systemctl status postgresql-15
⚠️ 注意:CentOS 自带仓库的 PostgreSQL 版本通常较低(如 9.x/10),生产环境应始终使用官方源安装最新稳定版。
1.2 Ubuntu/Debian 通过 PGDG 源安装
bash
sudo sh -c 'echo "deb https://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
sudo apt update
sudo apt install -y postgresql-15
Debian/Ubuntu 安装后会自动创建 postgres 系统用户并初始化集群,无需手动执行 initdb。
1.3 Docker 方式(开发测试首选)
yaml
# docker-compose.yml
services:
postgres:
image: postgres:16
environment:
POSTGRES_USER: appuser
POSTGRES_PASSWORD: secret
POSTGRES_DB: appdb
ports:
- "5432:5432"
volumes:
- pgdata:/var/lib/postgresql/data
volumes:
pgdata:
bash
docker compose up -d
Docker 方式的优势:环境完全隔离,不会污染宿主机;postgres 镜像会自动处理初始化,省去 initdb 步骤;数据通过 volume 持久化。
二、initdb:初始化数据库集群的关键决策
如果你通过包管理器或源码安装(非 Docker),需要手动初始化数据目录。initdb 的某些参数一旦设定,后续修改的成本极高。
2.1 核心参数
bash
initdb \
--pgdata=/var/lib/pgsql/15/data \
--encoding=UTF8 \
--locale=en_US.UTF-8 \
--data-checksums \
--auth=scram-sha-256

2.2 显式指定 PGDATA
initdb 默认使用环境变量 PGDATA 指定的目录,也可以通过 -D 参数显式指定:
bash
export PGDATA=/data/postgresql
initdb
初始化后的数据目录结构:
text
$PGDATA/
├── postgresql.conf # 主配置文件
├── pg_hba.conf # 客户端认证配置
├── pg_ident.conf # 用户名映射
├── base/ # 各数据库的物理文件
├── global/ # 集群级对象(如 pg_database)
├── pg_wal/ # WAL 日志
└── pg_log/ # 日志(取决于配置)
三、postgresql.conf:核心配置项
postgresql.conf 位于 $PGDATA 目录下,管理着数据库服务器的配置和性能。以下是最需要关注的几类参数。
3.1 内存参数:黄金三角

shared_buffers:默认仅 128MB,对于现代服务器明显偏低。一般建议设为物理内存的 15%-25%,例如 32GB 内存的机器设为 8GB。通常不需要超过 40%,过大的 shared_buffers 会导致检查点压力增大,收益递减。修改此参数需要重启服务器。
work_mem:这是每个排序或哈希操作可用的内存量,而不是每个连接的总配额。排序用于 ORDER BY、DISTINCT、MERGE JOIN;哈希用于哈希连接和基于哈希的聚合。默认 4MB 对于复杂查询可能不够,但盲目调大 work_mem 是危险操作------一个包含 Hash Join 和 Order By 的查询会消耗 2 × work_mem,100 个并发连接下,work_mem=32MB 的峰值可达 6.4GB,极易导致内存超限。
推荐公式:
text
work_mem ≈ 可用内存 × 0.25 ÷ max_connections
以 32GB 内存、100 个最大连接为例,work_mem 约为 80MB,但起始值建议保守设为 2-4MB,根据实际查询复杂度和并发量逐步微调。
effective_cache_size:告诉优化器"操作系统层面有多少内存可用于缓存",影响执行计划选择(是否走索引),但本身不占用内存。通常设为物理内存的 50%。
3.2 连接参数

⚠️ 核心原则:PostgreSQL 每个连接是一个独立进程,连接数过高会导致上下文切换开销剧增,且 work_mem 的乘法效应会迅速耗尽内存。生产环境应始终在应用和数据库之间部署 PgBouncer 等连接池。
3.3 WAL 与检查点参数

3.4 查询规划器参数(SSD 场景必调)

四、pg_hba.conf:客户端认证配置
pg_hba.conf 控制谁可以从哪里、用什么方式连接。匹配规则是从上到下,第一条匹配生效,因此顺序至关重要。
4.1 常见配置示例
text
TYPE DATABASE USER ADDRESS METHOD
local all postgres peer # 本地 postgres 用户免密
local all all scram-sha-256
host all all 127.0.0.1/32 scram-sha-256
host all all 192.168.1.0/24 scram-sha-256 # 内网网段
host all all 0.0.0.0/0 scram-sha-256 # 允许所有远程(谨慎)

4.2 允许远程连接的完整步骤
bash
# 1. 修改监听地址
# postgresql.conf
listen_addresses = '*'
# 2. 添加认证规则
# pg_hba.conf
host all all 0.0.0.0/0 scram-sha-256
# 3. 重启服务
sudo systemctl restart postgresql-15
# 4. 开放防火墙
sudo firewall-cmd --add-port=5432/tcp --permanent
sudo firewall-cmd --reload
⚠️ 安全警告:生产环境绝不要使用 0.0.0.0/0 配合 trust 认证。远程连接必须使用 scram-sha-256,并通过防火墙限制来源 IP。
五、psql:日常高效操作完全清单
psql 是 PostgreSQL 的官方命令行客户端。掌握以下命令,能让你在终端中完成 90% 的日常操作。
5.1 连接与切换
bash
# 本地连接(默认使用当前系统用户名)
psql
# 指定用户和数据库
psql -U appuser -d appdb
# 指定主机和端口
psql -h 192.168.1.100 -p 5432 -U appuser -d appdb
# 执行单条 SQL 后退出
psql -c "SELECT version();"
# 执行 SQL 文件
psql -f migration.sql
5.2 元命令(以 \ 开头)

\x 的价值:当查询返回的列很多、终端显示折行混乱时,\x 将每行转为"列名 | 值"的纵向格式,可读性大幅提升。\timing 打开后,每条 SQL 执行完会输出 Time: 12.345 ms,是日常性能感知的最轻量工具。
5.3 自定义 .psqlrc
在用户主目录创建 ~/.psqlrc,每次启动 psql 自动生效:
bash
\set QUIET 1
\pset null '(null)'
\pset border 2
\set HISTSIZE 10000
\timing on
\set PROMPT1 '%n@%/%R%# '
\set PROMPT2 '%n@%/%R%# '
\set COMP_KEYWORD_CASE upper
\echo 'psql ready.'
关键配置:
\pset null '(null)':NULL 值不再显示为空白,避免误判为空格。
\timing on:自动开启每条 SQL 的耗时显示。
HISTSIZE 10000:加大历史记录容量,方便回溯。
六、实战:Docker Compose 一键启动 PostgreSQL + pgAdmin
yaml
services:
postgres:
image: postgres:16
environment:
POSTGRES_USER: appuser
POSTGRES_PASSWORD: secret
POSTGRES_DB: appdb
ports:
- "5432:5432"
volumes:
- pgdata:/var/lib/postgresql/data
command:
- "postgres"
- "-c"
- "shared_buffers=256MB"
- "-c"
- "work_mem=8MB"
pgadmin:
image: dpage/pgadmin4
environment:
PGADMIN_DEFAULT_EMAIL: admin@example.com
PGADMIN_DEFAULT_PASSWORD: admin
ports:
- "8080:80"
depends_on:
- postgres
volumes:
pgdata:
启动后:
bash
docker compose up -d
psql -h localhost -U appuser -d appdb
七、小结
安装四条路径:包管理器(生产推荐官方源)、Docker(开发首选)、源码编译、云托管。
initdb 关键决策:--encoding=UTF8 必须选对,--data-checksums 生产必开,--locale 影响排序行为,--auth=scram-sha-256 是当前推荐认证方式。
内存黄金三角:shared_buffers 设为物理内存 15%-25%;work_mem 保守起步(2-4MB),警惕并发乘法效应;effective_cache_size 设为 50%,仅影响优化器。
SSD 必调:random_page_cost 从 4.0 降到 1.1-2.0,否则优化器会过度回避索引。
pg_hba.conf:从上到下匹配,第一条生效;生产环境绝不用 0.0.0.0/0 + trust。
psql 高效操作:\x 扩展显示、\timing 计时、\e 外部编辑、.psqlrc 自定义提示符和 NULL 显示。