Debian 上排查 PostgreSQL 故障的实用方法
一 快速定位流程
sudo systemctl status postgresql、sudo systemctl restart postgresql。tail -f /var/log/postgresql/postgresql-<version>-main.log、tail -f /var/log/syslog、journalctl -u postgresql。sudo -i -u postgres psql 测试,远程用 psql -h <host> -p <port> -U <user> -d <db> 测试;若仅本地失败,可能是 Unix 域套接字路径不匹配。top/iotop/df -h 检查 CPU/内存/磁盘,避免因 WAL 或数据目录占满导致异常。psql --version 与 pg_lsclusters 确认实例版本与数据目录,避免多版本/多实例混淆。二 常见故障场景与处理
sudo systemctl start postgresql。listen_addresses 包含所需地址(如 localhost 或 *),并放行 5432 端口(如 sudo ufw allow 5432)。md5/scram-sha-256 等认证方式,修改后执行 sudo systemctl reload postgresql。psql -h localhost 走 TCP,或软链套接字目录,或统一 unix_socket_directories 配置。pg_controldata <data_dir> 查看关键元数据与健康状态;必要时以单用户模式排查数据一致性。EXPLAIN (ANALYZE, BUFFERS) 查看执行计划与耗时;按需创建索引、避免 SELECT *、优化 JOIN 与子查询;确保统计信息新鲜(ANALYZE)。SELECT * FROM pg_replication_slots;,对废弃槽执行 SELECT pg_drop_replication_slot('slot_name');。pg_archivecleanup 清理过期段;在 postgresql.conf 调整 max_wal_size、min_wal_size、checkpoint_timeout、wal_compression 以平衡恢复点与磁盘占用。df -h 与 du -sh /var/lib/postgresql/* 定位大对象/表;清理无用表或归档日志;必要时扩容磁盘或迁移表空间。三 性能与复制的深入排查
pg_stat_activity 查看当前连接、查询与等待事件,定位长事务、锁等待与异常会话。pg_stat_statements(在 shared_preload_libraries 中加载并重启),查询最耗时/最频繁 SQL,指导索引与 SQL 优化。pg_stat_replication 检查复制延迟、状态与 WAL 发送/接收位置,排查网络抖动、磁盘 IO 或参数不当导致的追不上。VACUUM/ANALYZE,结合 work_mem、shared_buffers、effective_cache_size 等参数按负载调优;大表考虑分区与合理索引策略。四 监控与日志分析工具
五 常用命令与配置速查
| 目标 | 命令或路径 |
|---|---|
| 查看服务状态 | sudo systemctl status postgresql |
| 重启服务 | sudo systemctl restart postgresql |
| 查看 PostgreSQL 日志 | tail -f /var/log/postgresql/postgresql-<version>-main.log |
| 查看系统日志 | tail -f /var/log/syslog、journalctl -u postgresql |
| 本地连接测试 | sudo -i -u postgres psql |
| 远程连接测试 | psql -h <host> -p <port> -U <user> -d <db> |
| 主配置与认证 | /etc/postgresql/<version>/main/postgresql.conf、pg_hba.conf |
| 套接字目录核对 | `netstat -lp --protocol=unix |
| 复制槽检查 | SELECT * FROM pg_replication_slots; |
| WAL 清理 | pg_archivecleanup <WAL目录> <WAL文件名> |
| 语句级统计启用 | shared_preload_libraries = 'pg_stat_statements'(需重启) |