1. 检查PostgreSQL服务状态
首先确认PostgreSQL服务是否正在运行,使用以下命令查看服务状态:
sudo systemctl status postgresql
如果服务未运行,启动服务:
sudo systemctl start postgresql
若需开机自启,可执行:
sudo systemctl enable postgresql
2. 验证配置文件设置
PostgreSQL的主配置文件postgresql.conf和客户端认证文件pg_hba.conf是故障排查的关键:
listen_addresses(是否允许远程连接,如listen_addresses = '*')、port(默认5432,确保未被占用)等参数,修改后需重启服务:sudo systemctl restart postgresql
host all all 192.168.1.0/24 md5
修改后需执行sudo systemctl reload postgresql使配置生效。3. 检查防火墙与端口连通性
Ubuntu的防火墙(UFW)可能阻止PostgreSQL的默认端口(5432),需放行该端口:
sudo ufw allow 5432/tcp
sudo ufw enable # 若未启用防火墙
使用telnet或nc命令测试端口连通性(从客户端机器执行):
telnet <服务器IP> 5432
# 或
nc -zv <服务器IP> 5432
4. 查看PostgreSQL日志文件
日志是定位故障的核心依据,默认路径为/var/log/postgresql/<版本>/main/(如/var/log/postgresql/15/main/)。使用以下命令查看实时日志:
sudo tail -f /var/log/postgresql/15/main/postgresql.log
重点关注错误信息(如连接拒绝、权限不足、磁盘空间满等),日志中的时间戳可帮助定位故障发生时间。
5. 测试数据库连接
使用psql命令行工具测试本地连接(默认用户postgres):
sudo -u postgres psql
若本地连接正常,再测试远程连接(从客户端机器执行):
psql -h <服务器IP> -p 5432 -U <用户名> -d <数据库名>
输入密码后若仍无法连接,需返回检查配置文件和防火墙设置。
6. 分析数据库性能与活动
pg_stat_activity视图查看当前连接的进程,识别长时间运行的查询或阻塞进程:SELECT * FROM pg_stat_activity WHERE state = 'active';
pg_locks视图查看锁等待情况,定位阻塞事务:SELECT * FROM pg_locks WHERE NOT granted;
sudo apt install pgbadger),配置postgresql.conf开启详细日志(log_destination = 'csvlog'、logging_collector = on等),然后生成HTML报告:pgbadger /var/log/postgresql/15/main/postgresql-*.csv -o report.html
报告可直观展示慢查询、高频查询、锁等待等性能问题。7. 检查表空间与磁盘空间
SELECT spcname, pg_size_pretty(pg_tablespace_size(spcname)) AS size,
pg_size_pretty(pg_tablespace_size(spcname) - pg_tablespace_size(spcname) * 0.8) AS free_space
FROM pg_tablespace;
若表空间剩余空间不足(如小于20%),需清理无用数据或扩展表空间。df -h命令查看系统磁盘使用情况,确保/var/lib/postgresql/<版本>/main(数据目录)所在分区有足够空间。8. 排查用户权限问题
若出现“permission denied”错误,需检查用户权限:
\du # psql内查看用户列表及角色
GRANT ALL PRIVILEGES ON DATABASE mydb TO myuser;)或表操作权限(如GRANT SELECT, INSERT ON TABLE mytable TO myuser;)。