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
修复后重启服务,检查数据库是否能正常启动。