Debian 上 PostgreSQL 故障排查实用手册
一 快速定位流程
- 查看服务状态与版本:使用命令:sudo systemctl status postgresql;若需确认实例版本与目录,可查看 /etc/postgresql/ 下的目录名。
- 查看数据库日志:PostgreSQL 日志通常在 /var/log/postgresql/,实时跟踪可用:tail -f /var/log/postgresql/postgresql--main.log;系统层面可用 journalctl -u postgresql 或 tail -f /var/log/syslog 辅助定位。
- 确认端口监听与占用:默认端口 5432,检查占用:ss -lntp | grep 5432 或 netstat -tupln | grep 5432;若被占用,调整 postgresql.conf 的 port 或释放占用进程。
- 直连数据库验证:本地可用 psql -U -d -h /var/run/postgresql(Unix 套接字)或 psql -h 127.0.0.1 -p 5432 -U -d (TCP);远程连接需确保网络与认证策略允许。
- 配置文件核对:主配置 /etc/postgresql//main/postgresql.conf,客户端认证 /etc/postgresql//main/pg_hba.conf;修改后执行 sudo systemctl reload postgresql 使配置生效。
二 常见故障与修复
-
服务无法启动
- 日志报 “FATAL: could not load pg_hba.conf” 或 “No such file or directory”:检查 /var/lib/postgresql//main/pg_hba.conf 是否存在并可被 postgres 用户读取;Debian 上该文件通常由包管理维护,若缺失可从同版本模板恢复或重装对应包。
- 日志报 “configuration file contains errors”:例如 invalid value for parameter “lc_messages”,说明本地化未安装;执行 sudo dpkg-reconfigure locales 勾选所需 UTF-8 语言(如 en_US.UTF-8 或 zh_CN.UTF-8),再重启服务。
- 端口被占用:用 ss/netstat 找到占用 5432 的 PID,决定是停止冲突进程还是修改 postgresql.conf 的 port。
- 数据目录权限错误:确保数据目录(如 /var/lib/postgresql//main)属主为 postgres:postgres,权限 0700。
-
无法连接数据库
- 本机报错 “psql: 无法联接到服务器:没有那个文件或目录”:多为服务未运行或 Unix 域套接字路径异常;先 systemctl status postgresql,再检查 /var/run/postgresql/ 与日志。
- 远程连不通:核对 postgresql.conf 的 listen_addresses(如设为 ‘*’ 或包含服务器 IP),以及 pg_hba.conf 中对目标网段的 METHOD(如 md5/scram-sha-256);同时检查云安全组/本机防火墙(如 ufw allow 5432 或 iptables 规则)。
- SSL 连接问题:确认服务器启用 SSL 且证书路径正确;客户端可用 openssl s_client -connect hostname:5432 验证 TLS 握手。
-
性能与空间问题
- 慢查询:在 SQL 前加 EXPLAIN (ANALYZE, BUFFERS) 查看计划与实际耗时;为高频过滤/关联列建立合适索引,并定期 ANALYZE 更新统计信息。
- 语句级诊断:启用 pg_stat_statements,在 postgresql.conf 设置 shared_preload_libraries = ‘pg_stat_statements’ 并重启;查询 pg_stat_statements 找出最耗时的 SQL。
- WAL 堆积与磁盘告警:核查归档是否正常、是否存在长期未消费的 复制槽;必要时用 pg_archivecleanup 清理已归档 WAL,或 SELECT pg_drop_replication_slot(‘slot_name’) 删除废弃复制槽;可按需调整 max_wal_size / min_wal_size / checkpoint_timeout 降低检查点频率。
- 资源瓶颈:用 top/htop/vmstat 观察 CPU/内存/IO;结合 pg_stat_activity 查看是否有长时间运行或阻塞会话。
三 常用命令与配置清单
| 目标 |
命令或路径 |
| 查看服务状态 |
sudo systemctl status postgresql |
| 实时查看日志 |
tail -f /var/log/postgresql/postgresql--main.log |
| 查看系统日志 |
journalctl -u postgresql 或 tail -f /var/log/syslog |
| 检查端口占用 |
**ss -lntp |
| 本地连接测试 |
psql -U -d -h /var/run/postgresql |
| 远程连接测试 |
psql -h -p 5432 -U -d |
| 主配置文件 |
/etc/postgresql//main/postgresql.conf |
| 客户端认证 |
/etc/postgresql//main/pg_hba.conf |
| 数据目录 |
/var/lib/postgresql//main |
| 套接字目录 |
/var/run/postgresql |
| 启用语句统计 |
在 postgresql.conf 设置 shared_preload_libraries = ‘pg_stat_statements’ 并重启,查询 pg_stat_statements |
| WAL 清理 |
pg_archivecleanup /pgdata/pgwal <WAL文件名> |
| 复制槽检查 |
SELECT * FROM pg_replication_slots; |