CentOS上PostgreSQL故障排查指南
PostgreSQL的日志是故障排查的核心依据,通常位于/var/log/postgresql/目录(如postgresql-<version>-main.log)或数据目录(如/var/lib/pgsql/data/pgstartup.log)。使用tail -f /var/log/postgresql/postgresql-<version>-main.log实时查看实时日志,或less命令查看历史日志,重点关注FATAL、ERROR级别的错误信息(如配置错误、权限问题、数据库损坏等)。
使用systemctl status postgresql命令确认PostgreSQL服务是否正在运行。若未启动,尝试systemctl start postgresql启动服务;若启动失败,结合日志分析具体原因(如配置错误、端口占用、数据目录权限问题)。还可通过systemctl enable postgresql设置服务开机自启。
/var/lib/pgsql/data/postgresql.conf):检查关键配置项,如listen_addresses(需设置为'*'允许远程连接)、port(默认5432,确保未被占用)、max_connections(根据服务器性能调整)、shared_buffers(内存分配,建议为物理内存的25%左右)。host all all 0.0.0.0/0 md5;允许本地连接:local all all trust。修改后需执行ALTER SYSTEM SET listen_addresses='*'(若修改了postgresql.conf)并重启服务(systemctl restart postgresql)使配置生效。systemctl status postgresql),未启动则启动服务。netstat -tunlp | grep 5432或ss -tunlp | grep 5432检查5432端口是否被其他进程占用。若被占用,修改postgresql.conf中的port为其他端口(如5433),并重启服务。firewalld,需放行PostgreSQL端口:firewall-cmd --add-port=5432/tcp --permanent,然后firewall-cmd --reload。若使用iptables,需添加对应规则。pg_hba.conf中的认证方法(如md5或password),确保用户名、密码正确。远程连接时,需将METHOD改为md5或scram-sha-256,并重启服务。pg_stat_activity视图查看当前活动查询:SELECT * FROM pg_stat_activity WHERE state = 'active' ORDER BY query_start DESC;,重点关注query字段中的慢查询。EXPLAIN命令分析慢查询的执行计划,找出性能瓶颈(如全表扫描、索引未使用):EXPLAIN ANALYZE SELECT * FROM users WHERE age > 30;。若未使用索引,可创建合适的索引优化(如CREATE INDEX idx_users_age ON users(age);)。ANALYZE命令更新表统计信息,帮助优化器生成更优的执行计划:ANALYZE users;。死锁通常表现为多个事务相互等待对方释放锁,导致查询卡住。可通过以下步骤排查:
SELECT pid, query, wait_event_type, wait_event FROM pg_stat_activity WHERE wait_event_type = 'Lock';,找出等待锁的事务。SELECT pg_cancel_backend(pid);取消事务;若仍无法解决,使用SELECT pg_terminate_backend(pid);强制终止。使用top、htop、free -h、df -h等命令检查服务器资源使用情况:
work_mem参数(内存排序缓冲区大小)。shared_buffers、work_mem等参数,或增加物理内存。df -h显示根分区使用率超过80%),可能导致数据库无法写入或启动失败,需清理无用文件(如日志、临时文件)或扩容磁盘。PostgreSQL数据目录(如/var/lib/pgsql/data)必须由postgres用户拥有,且权限设置为700(仅所有者可读、写、执行)。若权限错误,可使用以下命令修复:
chown -R postgres:postgres /var/lib/pgsql/data chmod -R 0700 /var/lib/pgsql/data 修改后重启服务。
若数据库因意外关机、磁盘故障等原因损坏,可使用pg_resetwal工具修复(谨慎操作,需备份数据):
sudo -u postgres pg_resetwal -D /var/lib/pgsql/data 修复后重启服务,检查数据库是否能正常启动。