首先确认PostgreSQL服务是否正在运行,使用systemctl命令查看状态:
sudo systemctl status postgresql
若服务未启动,尝试手动启动并观察是否报错:
sudo systemctl start postgresql
若启动失败,需检查服务日志(如journalctl -u postgresql)或数据目录日志(如/var/lib/postgresql/<version>/main/log)获取具体错误信息。
日志是故障排查的核心依据,Debian下PostgreSQL日志默认位于/var/log/postgresql/目录,文件名格式为postgresql-<version>-main.log。使用以下命令实时查看最新日志:
sudo tail -f /var/log/postgresql/postgresql-<version>-main.log
可通过grep过滤关键错误(如ERROR、FATAL):
grep "ERROR" /var/log/postgresql/postgresql-<version>-main.log
日志级别可通过postgresql.conf中的log_min_messages参数调整(如设为ERROR捕获严重问题)。
若无法连接数据库,需依次检查以下内容:
netstat或ss命令检查是否监听:sudo netstat -tulnp | grep 5432
若未监听,需修改postgresql.conf中的listen_addresses(如设为*允许所有IP)并重启服务;ufw,开放5432端口:sudo ufw allow 5432
若使用iptables,添加允许规则;pg_hba.conf文件(位于/etc/postgresql/<version>/main/),确保有正确的客户端访问条目(如host all all 0.0.0.0/0 md5允许所有IP通过密码认证)。EXPLAIN命令分析查询执行计划,找出性能瓶颈(如未走索引):EXPLAIN SELECT * FROM users WHERE age > 30;
若未使用索引,可创建索引优化:CREATE INDEX idx_age ON users (age);
ANALYZE命令更新表统计信息,帮助查询优化器做出更优决策:ANALYZE users;
pg_stat_statements扩展(需修改postgresql.conf并重启),收集SQL语句执行统计信息,识别高频慢查询:CREATE EXTENSION IF NOT EXISTS pg_stat_statements;
SELECT * FROM pg_stat_statements ORDER BY total_time DESC LIMIT 10;
使用pgBadger工具分析日志,生成可视化性能报告(如慢查询占比、连接数趋势)。df -h命令检查磁盘使用情况,若/var/lib/postgresql/所在分区空间不足,需清理旧日志(如pg_archivecleanup清理WAL文件)或归档数据;free -m查看内存占用,若内存不足,可调整work_mem(排序操作内存)、shared_buffers(共享缓冲区)等参数(位于postgresql.conf);top或htop查看PostgreSQL进程的CPU、内存占用,识别内存泄漏或异常进程(如pg_top工具可针对性监控数据库进程)。PostgreSQL的主配置文件postgresql.conf(位于/etc/postgresql/<version>/main/)和访问控制文件pg_hba.conf是常见故障源,需检查以下内容:
listen_addresses(监听地址)、port(端口)、max_connections(最大连接数)、shared_buffers(共享缓冲区)等参数是否符合需求;pg_hba.conf中的认证方法(如md5或scram-sha-256)与客户端匹配;archive_command配置(postgresql.conf中),确保归档命令可执行;若存在废弃的复制槽,使用以下命令清理:SELECT * FROM pg_replication_slots; -- 查看复制槽
SELECT pg_drop_replication_slot('slot_name'); -- 删除废弃复制槽
server.crt、server.key)路径正确(postgresql.conf中ssl_cert_file、ssl_key_file参数),使用openssl测试连接:openssl s_client -connect localhost:5432 -showcerts
若以上步骤均无法解决问题,可尝试重启PostgreSQL服务(谨慎操作,避免数据丢失):
sudo systemctl restart postgresql
若服务仍无法启动,需从备份恢复数据(使用pg_restore或psql导入备份文件),确保备份文件完整且版本兼容。