本文目录导读:

基础网络与连通性检查
- 检查网络连接
- 确认应用服务器与数据库服务器是否在同一网络。
- 使用
ping测试网络是否可达,telnet <数据库IP> <端口>测试端口是否开放。
- 验证DNS解析
若使用域名连接,检查DNS配置是否正确,或直接使用IP测试。
数据库服务状态检查
- 查看数据库进程
systemctl status mysql/mariadb/postgresql # Linux netstat -anp | grep 3306 # 确保监听所有接口(0.0.0.0)或目标IP
- 确认监听配置
- 检查数据库配置文件(如
my.cnf、postgresql.conf)的bind-address是否允许远程连接。 - 若只监听本地(127.0.0.1),需改为
0.0.0或具体IP后重启。
- 检查数据库配置文件(如
数据库用户权限验证
- 确认用户是否存在
SELECT User, Host FROM mysql.user; -- MySQL \du -- PostgreSQL
- 检查Host限制
- 确保授权允许远程连接(如
'user'@'%'或特定IP),而非仅'user'@'localhost'。
- 确保授权允许远程连接(如
- 密码正确性
- 在数据库主机上用
mysql -u user -p -h 127.0.0.1测试,排除本地或远程差异。
- 在数据库主机上用
连接参数与配置检查
- 核对连接地址、端口、数据库名
- 检查应用配置文件(如
.env、application.yml)中的DATABASE_URL或host:port/dbname。 - 确保无多余空格或特殊字符。
- 检查应用配置文件(如
- 驱动与协议兼容性
- 确认数据库驱动版本与数据库版本匹配。
- 使用 SSL/TLS 时检查证书配置,或临时关闭SSL测试(如
useSSL=false)。
防火墙与安全组规则
- 系统防火墙
firewall-cmd --list-all # 检查是否放通了数据库端口(如 3306/tcp) iptables -L -n # 检查iptables规则
- 云服务商安全组
若服务器在云上(如AWS、阿里云),检查安全组入站规则是否允许目标IP或端口。
日志分析
- 应用日志
- 查看错误堆栈,常见错误如
CommunicationsException(网络)、Access denied(授权)。
- 查看错误堆栈,常见错误如
- 数据库日志
tail -f /var/log/mysql/error.log # MySQL tail -f /var/log/postgresql/postgresql-<version>-main.log
检查是否有认证失败(密码/用户错误)、连接池耗尽或协议错误。
资源限制与配置优化
- 连接数限制
SHOW VARIABLES LIKE 'max_connections'; -- 检查是否达到上限
- 文件描述符限制
ulimit -a # 检查系统级限制,建议增大 nofile
- 数据库字符集或排序规则
若连接参数包含数据库名,确认该数据库存在且字符集兼容(如 UTF-8)。
特殊场景:容器或Docker环境
- 检查容器网络
docker network ls # 确保容器在同一网络 docker logs <container_id> # 查看容器日志
- 端口映射
docker port <container_id> # 确认宿主机端口正确映射到容器内数据库端口
快速故障诊断清单(参考)
| 问题现象 | 可能原因 | 快速排查命令/操作 |
|---|---|---|
Connection refused |
服务未启动、端口占用、IP绑定错误 | netstat -tlnp、systemctl status <db> |
Access denied |
用户/密码错误、Host限制 | mysql -u user -p -h 127.0.0.1 测试 |
Unknown database |
数据库名错误或不存在 | SHOW DATABASES; 核实 |
Communications link failure |
网络超时(防火墙、DNS、带宽) | ping、telnet 测试 |
| 连接池耗尽 | 应用锁死或并发过高 | SHOW PROCESSLIST; 查看活跃连接 |
最终验证
成功修改后,依次:
- 重启数据库(若修改配置文件)
- 重启应用服务
- 简单用命令行工具测试连接(如
mysql -h <IP> -P <port> -u user -p) - 观察应用日志无错误
通过以上步骤,95%以上的数据库连接问题可定位解决,若仍失败,建议分享具体的错误信息或日志片段以便进一步分析。