咨询热线:4006-75-4006
售前:9:00-23:30 备案:9:00-18:00 技术:7*24h
本教程面向具备 Linux 系统管理经验的运维人员,涵盖生产环境部署全流程,包含安全加固与最佳实践。当前主流版本为 PostgreSQL 15/16,教程以 16 为例。
方式 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
官方 RPM/DEB 包 | 生产环境(推荐) | 自动配置 systemd 服务、版本稳定、升级方便 | 依赖官方源 |
源码编译 | 定制化需求(如特殊路径、编译参数) | 灵活控制安装路径和特性 | 需手动配置服务、维护成本高 |
Docker | 开发/测试环境 | 快速部署、环境隔离 | 不适合核心生产库 |
建议:生产环境优先使用官方包管理器安装,避免手动编译带来的维护负担。
sudo dnf install -y postgresql16-server postgresql16-contrib
# 默认数据目录:/var/lib/pgsql/16/data
sudo /usr/pgsql-16/bin/postgresql-16-setup initdb
# 自定义数据目录(生产环境推荐)
sudo mkdir -p /data/pgdata
sudo chown postgres:postgres /data/pgdata
sudo chmod 700 /data/pgdata
sudo -u postgres /usr/pgsql-16/bin/initdb -D /data/pgdata
注意:数据目录权限必须为
700且属主为postgres用户,否则 PostgreSQL 拒绝启动。
# /etc/systemd/system/postgresql-16.service
[Unit]
Description=PostgreSQL 16 database server
After=network.target
[Service]
Type=notify
User=postgres
Group=postgres
ExecStart=/usr/pgsql-16/bin/postmaster -D /data/pgdata
ExecReload=/bin/kill -HUP $MAINPID
KillMode=mixed
KillSignal=SIGINT
TimeoutSec=300
OOMScoreAdjust=-1000
Environment=PGDATA=/data/pgdata
[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable postgresql-16
sudo systemctl start postgresql-16
# 导入 GPG 密钥
curl -fsSL /media/keys/ACCC4CF8.asc | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/postgresql.gpg
# 添加仓库
echo "deb http://www.landui.com/pub/repos/apt $(lsb_release -cs)-pgdg main" | sudo tee /etc/apt/sources.list.d/pgdg.list
# 安装
sudo apt update
sudo apt install -y postgresql-16 postgresql-contrib-16
# 服务自动配置,数据目录默认为 /var/lib/postgresql/16/main
下载安装包:从 EnterpriseDB 获取图形化安装程序
关键配置项:
数据目录:建议放在非系统盘(如 D:\\pgdata)
端口:默认 5432,多实例需修改
超级用户密码:必须设置强密码
本地化:建议选择 Chinese (Simplified), China + UTF8
服务管理:
服务名格式:postgresql-x64-16
通过 services.msc 或 PowerShell 管理:
Start-Service "postgresql-x64-16"
Set-Service "postgresql-x64-16" -StartupType Automatic
sudo -u postgres psql
-- 修改 postgres 用户密码(注意:字符串用单引号,标识符用双引号)
ALTER USER postgres PASSWORD 'StrongP@ssw0rd!';
-- 创建应用专用用户(最小权限原则)
CREATE USER app_user WITH PASSWORD 'AppP@ss123' NOSUPERUSER NOCREATEDB;
GRANT CONNECT ON DATABASE mydb TO app_user;
GRANT SELECT, INSERT, UPDATE ON ALL TABLES IN SCHEMA public TO app_user;
语法提醒:PostgreSQL 中 单引号
' '用于字符串,双引号" "用于标识符(如表名、列名)。错误示例:SELECT * FROM 'users'(应为SELECT * FROM users或SELECT * FROM "Users")。
# /var/lib/pgsql/16/data/pg_hba.conf
# 本地连接:使用 peer(Linux)或 ident(Windows)认证
local all all peer
# 本地 TCP:使用 md5 密码认证(禁用 trust!)
host all all 127.0.0.1/32 md5
host all all ::1/128 md5
# 远程连接(按需开放):限制 IP 段 + md5 认证
host mydb app_user 192.168.1.0/24 md5
# 仅监听本地(默认)
listen_addresses = 'localhost'
# 允许远程访问(生产环境建议配合防火墙使用)
listen_addresses = '*'
# 或指定 IP
listen_addresses = '192.168.1.100'
# CentOS/RHEL
sudo firewall-cmd --permanent --add-port=5432/tcp
sudo firewall-cmd --reload
# Ubuntu
sudo ufw allow from 192.168.1.0/24 to any port 5432
# 内存配置(根据服务器总内存调整)
shared_buffers = 4GB # 建议为物理内存的 25%
work_mem = 64MB # 每个排序操作可用内存
maintenance_work_mem = 1GB # VACUUM/CREATE INDEX 等操作
# WAL 与检查点
max_wal_size = 4GB
min_wal_size = 1GB
checkpoint_completion_target = 0.9
# 连接数
max_connections = 200 # 根据应用需求调整
# 日志(便于问题排查)
logging_collector = on
log_directory = 'log'
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'
log_statement = 'mod' # 记录 DDL 和 DML,生产环境慎用 'all'
修改后需重载配置:
sudo systemctl reload postgresql-16(部分参数需重启)
操作 | 命令 |
|---|---|
切换到 postgres 用户 |
|
进入 psql |
|
查看数据库 |
|
查看表 |
|
查看连接 |
|
重载配置 |
|
备份(逻辑) |
|
备份(物理) |
|
查看日志 |
|
问题现象 | 排查步骤 |
|---|---|
服务无法启动 | 1. 检查数据目录权限 |
连接被拒绝 | 1. 检查服务状态 |
远程连接失败 | 1. 确认 |
磁盘空间不足 | 1. 清理 WAL: |
使用独立数据盘存放 /var/lib/pgsql(避免系统盘写满)
配置定期逻辑备份(pg_dump + crontab)和物理备份(pg_basebackup)
启用 WAL 归档(archive_mode = on)实现 PITR(时间点恢复)
监控关键指标:连接数、慢查询、磁盘空间、WAL 增长
定期执行 ANALYZE 和 VACUUM(或启用 autovacuum)
禁用 trust 认证,强制使用 md5 或 scram-sha-256
限制超级用户远程登录,应用使用最小权限账号
配置 SSL 加密传输(ssl = on + 证书)
定期更新小版本(如 16.1 → 16.2)修复安全漏洞
建立变更管理流程:所有 DDL 操作需经过审核