Ubuntu 上 PostgreSQL 故障排查步骤
一 快速定位与通用检查
sudo systemctl status postgresql、sudo systemctl is-enabled postgresql、pg_lsclusters。sudo tail -n50 /var/log/postgresql/postgresql-15-main.log、sudo journalctl -u postgresql@15-main -b。ss -lntp | grep 5432、sudo lsof -iTCP:5432 -sTCP:LISTEN。sudo ufw allow 5432/tcp。二 常见故障与修复对照表
| 症状 | 关键检查 | 修复建议 |
|---|---|---|
| 服务启动失败,状态显示 failed | journalctl -u postgresql@15-main、/var/log/postgresql/*.log |
依据日志逐项修复(如权限、配置、数据目录) |
| 本地 psql 报 “No such file or directory” | 套接字路径:/var/run/postgresql/.s.PGSQL.5432 或 /tmp/.s.PGSQL.5432 | 确认服务器实际创建的套接字目录,使用 psql -h /var/run/postgresql 指定目录,或创建符号链接统一路径 |
| FATAL: private key file 权限错误 | /etc/ssl/private/ssl-cert-snakeoil.key 权限与属主 |
执行:sudo chown postgres:postgres /etc/ssl/private/ssl-cert-snakeoil.key && sudo chmod 640 /etc/ssl/private/ssl-cert-snakeoil.key |
| 端口被占用 | `ss -lntp | grep 5432` |
| 远程连接被拒绝或超时 | listen_addresses、pg_hba.conf、防火墙 |
设置 listen_addresses='*',在 pg_hba.conf 增加 host all all 0.0.0.0/0 md5(按需收紧),并放行 5432/tcp |
| 启动日志提示数据目录不可访问或 PID 文件无法创建 | 数据目录挂载、权限、/run 临时目录 | 确认挂载已就绪、目录属主为 postgres:postgres,必要时调整挂载顺序或 systemd 启动依赖 |
| FATAL: could not create semaphores | 系统信号量不足 | 调大内核参数(如 kernel.sem),或减少 max_connections |
三 远程连接专项排查
listen_addresses = '*'(或指定服务器 IP),port = 5432。host all all 192.168.1.0/24 md5 或 host all all 0.0.0.0/0 md5(生产环境请限制来源)。sudo ufw allow 5432/tcp;如使用云服务器,同步放通安全组入站规则。psql -h <服务器IP> -p 5432 -U <用户> -d <库名>。四 启动依赖与系统资源问题
systemctl status 显示 Result: protocol,日志提示数据目录不可访问或 PID 文件无法创建。sudo mkdir -p /etc/systemd/system/postgresql@15-main.service.dsudo tee /etc/systemd/system/postgresql@15-main.service.d/override.conf <<'EOF'[Service]ExecStartPre=/bin/sleep 5EOFsudo systemctl daemon-reload && sudo rebootsysctl -w kernel.sem="250 32000 100 128"),或减少 max_connections 以降低信号量占用。五 最小复现与验证清单
sudo -u postgres psql -c "select version();"(能连说明服务与本地套接字正常)。psql -h <IP> -p 5432 -U <user> -d postgres(能连说明网络、防火墙、listen_addresses、pg_hba 正常)。ss -lntp | grep 5432 应看到 postgres 进程监听 0.0.0.0:5432 或 *:5432。postgresql.conf/pg_hba.conf 后优先执行 sudo systemctl reload postgresql,减少业务中断。