PostgreSQL在Linux各发行版安装差异大:Ubuntu/Debian用apt自动启服务,数据目录为/var/lib/postgresql//main;RHEL系需dnf启用模块并手动initdb,数据目录为/var/lib/pgsql//data;启动失败优先查journalctl日志、目录权限及postmaster.pid残留;首次登录须sudo -u postgres psql设密码并修改pg_hba.conf后reload。

PostgreSQL 在主流 Linux 发行版上安装非常直接,但不同发行版的包名、服务名、数据目录和默认用户权限差异较大——不注意这些细节,容易卡在启动失败、连接拒绝或权限拒绝上。
Ubuntu/Debian 上用 apt 安装 PostgreSQL
Ubuntu 20.04+ 和 Debian 11+ 默认源里已包含较新版本(如 PostgreSQL 14/15),无需手动加仓库:
- 运行
sudo apt update && sudo apt install postgresql postgresql-contrib - 安装后服务自动启用并启动,主进程由
systemd管理,服务名为postgresql - 默认创建系统用户
postgres,数据库超级用户也叫postgres,但无密码,仅允许peer或ident认证(即本地 Unix socket 登录需匹配系统用户名) - 数据目录通常是
/var/lib/postgresql/*/main(*为版本号),配置文件在/etc/postgresql/*/main/下
CentOS/RHEL/Rocky 9+ 使用 dnf 安装
RHEL 系发行版从 9 开始默认使用 PostgreSQL 13+,但需启用 postgresql:releases 模块(旧版如 CentOS 7 需启用 pgdg 仓库):
- Rocky 9 / RHEL 9:运行
sudo dnf module enable postgresql:15(或:16),再执行sudo dnf install postgresql-server postgresql-contrib - 初始化数据库簇:必须显式运行
sudo postgresql-setup --initdb,否则systemctl start postgresql会失败并报错data directory has wrong ownership - 服务名是
postgresql,但实际 unit 文件可能带版本后缀(如postgresql-15),建议用systemctl list-units | grep postgres确认 - 默认监听地址为
localhost,且pg_hba.conf中对local连接默认使用peer,远程host条目默认被注释
启动失败常见原因与快速排查
执行 sudo systemctl start postgresql 后状态为 failed,别急着重装,先看三处:
- 查日志:
sudo journalctl -u postgresql -n 50 -e,重点关注could not access directory(权限问题)或lock file "postmaster.pid" already exists(残留进程或异常关机) - 检查数据目录归属:
sudo ls -ld /var/lib/pgsql/*/data(RHEL)或sudo ls -ld /var/lib/postgresql/*/main(Debian),必须属postgres:postgres - 确认
postmaster.pid是否残留:sudo -u postgres cat /var/lib/pgsql/*/data/postmaster.pid,若存在且对应进程已死,手动删掉它(再重启前) - 修改过
postgresql.conf的port或listen_addresses后未 reload,会导致psql连不上,但服务状态仍是 active (running)
首次登录与基础安全设置
安装完不能直接用 psql -U postgres 连,因为默认没设密码,且 pg_hba.conf 不允许密码登录:
- 切换到
postgres用户:sudo -u postgres psql(这是唯一能进去的方式) - 在 psql 里设密码:
ALTER USER postgres PASSWORD 'your_strong_password'; - 编辑
pg_hba.conf,找到local all all peer这一行,改为md5(如需密码登录本地 socket);若要允许远程连接,添加类似host all all 0.0.0.0/0 md5的行 - 改完必须执行
sudo systemctl reload postgresql(不是 restart),否则配置不生效
最容易被忽略的是:改了 pg_hba.conf 却忘记 reload,或者改了 postgresql.conf 的 listen_addresses 却没开防火墙端口(如 sudo firewall-cmd --add-port=5432/tcp --permanent && sudo firewall-cmd --reload)。这些操作缺一不可,顺序也不能乱。










