咨询热线:4006-75-4006

售前:9:00-23:30    备案:9:00-18:00    技术:7*24h

PostgreSQL安装部署运维实战教程

2026-02-09 17:36:49 992次

PostgreSQL 安装部署运维实战教程

本教程面向具备 Linux 系统管理经验的运维人员,涵盖生产环境部署全流程,包含安全加固与最佳实践。当前主流版本为 PostgreSQL 15/16,教程以 16 为例。


一、安装方式选择



方式

适用场景

优点

缺点

官方 RPM/DEB 包

生产环境(推荐)

自动配置 systemd 服务、版本稳定、升级方便

依赖官方源

源码编译

定制化需求(如特殊路径、编译参数)

灵活控制安装路径和特性

需手动配置服务、维护成本高

Docker

开发/测试环境

快速部署、环境隔离

不适合核心生产库


建议:生产环境优先使用官方包管理器安装,避免手动编译带来的维护负担。


二、Linux 环境安装(以 CentOS/RHEL 8/9 为例)

1. 配置官方 YUM 源


# 导入 GPG 密钥
sudo rpm --import /media/keys/ACCC4CF8.asc

# 添加官方仓库(以 PG16 为例)
sudo dnf install -y /pub/repos/yum/reporpms/EL-$(rpm -E %{rhel})-x86_64/pgdg-redhat-repo-latest.noarch.rpm

# 禁用系统自带的 PostgreSQL 模块(避免冲突)
sudo dnf -qy module disable postgresql

2. 安装服务端与客户端

sudo dnf install -y postgresql16-server postgresql16-contrib

3. 初始化数据目录(关键步骤)

# 默认数据目录:/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 拒绝启动。

4. 配置 systemd 服务(自定义数据目录时)

# /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


三、Ubuntu/Debian 安装

# 导入 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


四、Windows 安装要点

  1. 下载安装包:从 EnterpriseDB 获取图形化安装程序

  2. 关键配置项

    • 数据目录:建议放在非系统盘(如 D:\\pgdata

    • 端口:默认 5432,多实例需修改

    • 超级用户密码:必须设置强密码

    • 本地化:建议选择 Chinese (Simplified), China + UTF8

  3. 服务管理

    • 服务名格式:postgresql-x64-16

    • 通过 services.msc 或 PowerShell 管理:

    Start-Service "postgresql-x64-16"

    Set-Service "postgresql-x64-16" -StartupType Automatic


五、安全加固(生产环境必做)

1. 修改默认密码

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 usersSELECT * FROM "Users")。

2. 配置认证方式(pg_hba.conf)

# /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

3. 限制监听地址(postgresql.conf)

# 仅监听本地(默认)

listen_addresses = 'localhost'


# 允许远程访问(生产环境建议配合防火墙使用)

listen_addresses = '*'

# 或指定 IP

listen_addresses = '192.168.1.100'

4. 防火墙配置

# 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


六、基础配置优化(postgresql.conf)

# 内存配置(根据服务器总内存调整)

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 用户

sudo -i -u postgres

进入 psql

psqlpsql -U app_user -d mydb -h 127.0.0.1

查看数据库

\\l

查看表

\\dt

查看连接

SELECT * FROM pg_stat_activity;

重载配置

SELECT pg_reload_conf();systemctl reload postgresql-16

备份(逻辑)

pg_dump -U postgres mydb > mydb.sql

备份(物理)

pg_basebackup -D /backup/pg16 -Ft -z -P -U replicator

查看日志

journalctl -u postgresql-16 -ftail -f /var/lib/pgsql/16/data/log/postgresql-*.log


八、常见问题排查


问题现象

排查步骤

服务无法启动

1. 检查数据目录权限 ls -ld /var/lib/pgsql/16/data
2. 查看日志 journalctl -u postgresql-16 -n 50
3. 手动启动调试 /usr/pgsql-16/bin/postgres -D /var/lib/pgsql/16/data

连接被拒绝

1. 检查服务状态 systemctl status postgresql-16
2. 检查端口监听 ss -tlnp | grep 5432
3. 检查 pg_hba.conf 认证规则

远程连接失败

1. 确认 listen_addresses 配置
2. 检查防火墙/安全组规则
3. 验证 pg_hba.conf 是否允许该 IP

磁盘空间不足

1. 清理 WAL:pg_archivecleanup
2. 执行 VACUUM FULL(谨慎使用)
3. 检查大表:`SELECT schemaname, tablename, pg_size_pretty(pg_total_relation_size(schemaname


九、生产环境最佳实践清单 

  • 使用独立数据盘存放 /var/lib/pgsql(避免系统盘写满)

  • 配置定期逻辑备份(pg_dump + crontab)和物理备份(pg_basebackup

  • 启用 WAL 归档(archive_mode = on)实现 PITR(时间点恢复)

  • 监控关键指标:连接数、慢查询、磁盘空间、WAL 增长

  • 定期执行 ANALYZEVACUUM(或启用 autovacuum)

  • 禁用 trust 认证,强制使用 md5scram-sha-256

  • 限制超级用户远程登录,应用使用最小权限账号

  • 配置 SSL 加密传输(ssl = on + 证书)

  • 定期更新小版本(如 16.1 → 16.2)修复安全漏洞

  • 建立变更管理流程:所有 DDL 操作需经过审核





首页
最新活动
个人中心
XML 地图