导语:数据库连接失败常见于配置错误或网络不通,检查凭证、端口及连接池设置可快速定位问题。
Q&A模块
Q1:数据库连接超时如何排查?场景说明:应用层提示"Connection timed out",且无法telnet/nc测试数据库端口连通性具体操作:
- 使用nc -zv [host]:[port] 验证端口可达性(如nc -zv 127.0.0.1:3306)
- 查看MySQL错误日志:sudo tail -n 50 /var/log/mysql/error.log
- 检查防火墙规则:sudo ufw status verbose | grep 3306预期结果:若nc能连通且防火墙放行,问题在应用层配置;若无法连通需排查网络路由或数据库服务状态
Q2:数据库凭证错误导致连接中断?场景说明:应用启动时报错"Access denied for user",且确认密码正确具体操作:
- 检查mysql.user表授权字段:SELECT host,user,authentication_string FROM mysql.user;
- 验证字符编码一致性:SHOW VARIABLES LIKE 'character_set%';
- 校验SSL连接参数:SELECT ssl_cipher,verify_signature FROM mysql.user WHERE user='your_user';预期结果:发现授权字段host列存在通配符差异(如'%@localhost'与'127.0.0.1'),需调整host配置或创建特定host的用户
Q3:连接池配置不当引发资源耗尽?场景说明:高并发下出现"Too many connections"错误具体操作:
- 查看当前连接数:SHOW STATUS LIKE 'Threads_connected';
- 调整max_connections参数:SET GLOBAL max_connections=1000;
- 修改wait_timeout设置:SET GLOBAL wait_timeout=600;预期结果:连接池上限提升后可承载更高并发,但需配合应用层配置(如HikariCP的maximumPoolSize)同步调整
异常处理专区
常见报错及解决方案
| 报错信息 | 原因 | 修复方法 ||---------------------------------------|------------------------|--------------------------------------------------------------------------|| "Connection refused" | 数据库服务未启动 | systemctl status mysql.service;若未启动则执行systemctl start mysql.service || "Can't connect to MySQL server" | 配置文件绑定地址错误 | grep bind-address /etc/mysql/mysql.conf.d/mysqld.cnf;修改为127.0.0.1或0.0.0.0 || "SSL connection error" | SSL协议版本不匹配 | 在连接参数添加?characterEncoding=utf8&useSSL=false 或指定SSL版本参数 |
总结与延伸
- 禁用SSL连接可避免版本兼容问题:在jdbc连接字符串末尾添加&useSSL=false
- 推荐定期检查mysql.user表授权字段,使用CREATE USER 'user'@'host' IDENTIFIED BY 'password' 命令创建精确绑定的用户
- 高可用场景配置连接池监控指标:com.zaxxer.hikari.HikariPool#addConnection,设置合理的maximumPoolSize为物理CPU核心数×2