一. 问题描述
在本地开发环境中,我们经常会遇到MySQL连接失败的情况。这种情况可能会突然发生,而且往往伴随着一些复杂的错误信息,如“Public Key Retrieval is not allowed”或“Lost connection to Mysql server at ‘waiting for initial communication packet’”。本文将带您一步步排查这些常见问题,并提供快速的解决方案。
二. 解决思路与分析
2.1. “Public Key Retrieval is not allowed”错误
- 检查你的MySQL连接器版本,确保它与MySQL服务器版本兼容。
- 修改
mysql-connector-java
的配置,添加allowPublicKeyRetrieval=true
。
可能原因:这个错误通常是由于MySQL 8.0及以上版本的安全设置引起的。MySQL 8.0默认的身份验证插件被改为cachingsha2password
,而旧版本的mysql-connector-java
可能不支持这种身份验证方式。
排查步骤:
2.2. “Lost connection to Mysql server at ‘waiting for initial communication packet’”错误
- 检查MySQL服务器的配置文件
my.cnf
,确保没有启用反向DNS解析。 - 如果问题依旧存在,尝试禁用反向DNS解析。
可能原因:这个错误可能是由于MySQL服务器启用了DNS反向解析功能导致的。当客户端尝试连接到MySQL服务器时,服务器会尝试解析客户端的IP地址以获得其主机名,这个过程可能会因为DNS查询失败而引起连接问题。
排查步骤:
三. 解决方案
方案一:修改MySQL连接器配置
- 下载并解压最新的
mysql-connector-java
。 - 修改
mysql-connector-java
的config.properties
文件,添加以下行:allowPublicKeyRetrieval=true
- 将修改后的
mysql-connector-java
放入项目的lib
目录。
步骤:
代码示例:
Connection conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/yourdatabase?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true",
"username", "password"
);
方案二:禁用MySQL反向DNS解析
- 打开MySQL配置文件
my.cnf
(或my.ini
,取决于你的操作系统)。 - 在
[mysqld]
区域添加以下行:skip-name-resolve
- 修改连接字符串,添加
useSSL=false
和serverTimezone=UTC
参数:Connection conn = DriverManager.getConnection( "jdbc:mysql://localhost:3306/yourdatabase?useSSL=false&serverTimezone=UTC", "username", "password" );
步骤:
代码示例:
四. 总结
通过上述步骤,您应该能够快速排查并解决本地MySQL连接失败的问题。如果在实施上述解决方案后问题仍然存在,请检查网络连接、防火墙设置或其他可能影响连接的因素。希望本文能对您有所帮助!