无法连接数据库是最常见的故障之一,需依次检查以下环节:
sudo iptables -L -n查看防火墙规则,确认5432端口(PostgreSQL默认端口)是否开放;若未开放,使用sudo ufw allow 5432开放端口。systemctl status postgresql查看服务是否运行;若未启动,使用systemctl start postgresql启动服务。postgresql.conf(通常位于/etc/postgresql/<version>/main/)中的listen_addresses参数,确保允许远程连接(如设置为*表示允许所有IP);同时检查pg_hba.conf文件,确认有正确的客户端访问控制条目(如host all all 0.0.0.0/0 md5允许所有IP通过密码认证)。telnet <服务器IP> 5432或nc -zv <服务器IP> 5432测试端口是否可达。日志是故障排查的核心依据,PostgreSQL日志通常位于/var/log/postgresql/目录(如postgresql-<version>-main.log)。
sudo tail -f /var/log/postgresql/postgresql-<version>-main.log跟踪最新日志,快速定位错误信息(如连接拒绝、查询超时等)。grep命令筛选关键错误,例如grep "ERROR" /var/log/postgresql/postgresql-<version>-main.log查看所有错误条目。pgBadger生成可视化报告(如慢查询、连接统计),安装命令为sudo apt-get install pgbadger,分析命令为pgbadger -d /var/log/postgresql/ -o report.html(生成HTML格式报告)。查询慢是性能问题的主要表现,可通过以下工具和方法定位:
EXPLAIN关键字(如EXPLAIN SELECT * FROM users WHERE age > 30;),查看执行计划。若出现“Seq Scan”(全表扫描),需为相关字段创建索引(如CREATE INDEX idx_age ON users(age);)。ANALYZE命令更新表统计信息,帮助查询优化器选择更优的执行计划。pg_stat_statements扩展(在postgresql.conf中设置shared_preload_libraries = 'pg_stat_statements'并重启服务),通过SELECT * FROM pg_stat_statements ORDER BY total_time DESC LIMIT 10;查看耗时最长的查询,针对性优化。磁盘空间不足会导致数据库崩溃或性能下降,常见原因及解决方法:
pg_wal,默认位于数据目录下),若占用过高,可使用pg_archivecleanup清理过期日志(如sudo pg_archivecleanup /var/lib/postgresql/<version>/main/pg_wal 0000000100000032000000A1,保留指定日志文件)。SELECT * FROM pg_replication_slots;查看复制槽状态,使用SELECT pg_drop_replication_slot('slot_name');删除废弃槽。postgresql.conf中的max_wal_size(如设置为20GB)、min_wal_size(如5GB)、checkpoint_timeout(如30分钟)等参数,延长检查点间隔,减少WAL日志生成频率。内存泄漏或资源不足会导致数据库周期性重启(OOM)或响应缓慢:
pg_top命令监控PostgreSQL进程的内存使用情况,找出内存占用持续增长的进程。work_mem(排序、哈希操作的内存分配,如设置为4MB)、maintenance_work_mem(维护操作的内存,如设置为64MB)等参数,避免内存过度消耗。死锁会导致事务相互等待,无法继续执行:
SELECT * FROM pg_locks;查看当前锁状态,识别相互等待的事务。SELECT pg_cancel_backend(<pid>);取消阻塞事务的进程,或使用SELECT pg_terminate_backend(<pid>);终止进程(谨慎使用,避免数据丢失)。配置不当会导致连接失败、性能低下等问题:
postgresql.conf中的listen_addresses设置为*(允许所有IP)或指定允许的IP段(如192.168.1.0/24)。max_connections(如设置为100),避免过多连接导致内存耗尽。shared_buffers(如设置为物理内存的25%,如8GB内存设置为2GB),提高缓存命中率。定期维护是保持数据库高性能的关键:
VACUUM清理表中的死元组(如VACUUM VERBOSE users;),释放空间;对于频繁更新的表,使用VACUUM FULL(需锁表,建议在低峰期执行)。ANALYZE更新表统计信息(如ANALYZE VERBOSE users;),帮助优化器选择最优查询计划。REINDEX重建索引(如REINDEX TABLE users;),修复索引碎片;使用pg_repack压缩表(如pg_repack -t users),减少表占用空间。