点击 ”运维笔谈” 头条号,私信输入 “阿里云k8s” 可以获取《阿里云Kubernetes项目实战手册》PDF。
刚才有个朋友让我帮他重启下MySQL服务,我登上他的服务器去检查了下MySQl状态 ` systemctl status mysqld ` 发现MySQL服务是正常运行的。然后我又再次检查了下MySQL的3306端口也可以正常telnet,最终我使用mysql -h xxx 登录mysql,能成功登录并且可以执行SQL查询。我告诉他MySQL没有问题,不需要重启的。但是他告诉我他的Java程序连接MySQL超时了,还贴了一段报错信息给我:
Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection; nested exception is com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times. Giving up.
这的确是连接MySQL服务报错了。org.springframework.jdbc.CannotGetJdbcConnectionException,意味着无法获取到JDBC连接。嵌套的异常是com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException,说明在尝试创建到数据库服务器的连接时失败了,并且已经尝试重新连接了3次,之后放弃。
一般出现这个问题,我们有如下几个排错步骤:
检查数据库连接: 确认数据库服务是否正常运行,我们可以通过直接在数据库服务器上使用命令行工具尝试连接数据库来验证。检查配置: 检查应用程序配置文件(如application.properties或application.yml),确认数据库URL、用户名、密码、端口等配置信息是否正确无误。错误的配置信息是导致此类问题的常见原因。网络问题: 如果数据库服务器和应用程序不在同一台机器上,检查两者之间的网络连接是否畅通,是否有防火墙或网络策略阻止了连接。资源限制: 查看数据库服务器是否有连接数限制,或者当前已达到最大连接数。这可以通过查看数据库服务器的配置或运行状态来判断,必要时调整max_connections参数。驱动兼容性: 确保我们使用的MySQL JDBC驱动版本与数据库版本兼容。不兼容的驱动程序可能会导致连接问题。超时设置: 检查数据库连接的超时设置是否过短,或者是否有适当的重试逻辑。在高负载或网络不稳定的情况下,适当的超时和重试设置可以提高连接的稳定性。日志查看: 查看日志,可能会有更多关于为什么连接失败的具体信息,比如认证失败、账号权限问题等。他程序之前跑得好好的,今天突然变成这样了。可是MySQL明明是正常的,怎么会出现连接异常的情况呢?在他强烈要求下,我重启了下MySQL服务,然后程序依然报连接数据库错误。
后来他告诉我客户调整了网络策略,我又问他:你的Java程序是不是直连服务器上的MySQL IP地址,他告诉我 是的。这就更加奇怪了,本地程序连接本地MySQL,客户调整对外的网络策略,怎么也不会影响到内网连接啊。
我实在是不放心,我让他把jdbc连接配置发给我看看。原来啊,他当初为了在家里调试方便,把程序里的MySQL连接地址配置成了公网IP,并且还是硬编码不是配置文件。发生产环境的jar包也没有修改为服务器内网IP,才最终造成了这次MySQL连接异常的问题。