一. 问题描述

在本地开发环境中,我们经常会遇到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 8.0及以上版本的安全设置引起的。MySQL 8.0默认的身份验证插件被改为cachingsha2password,而旧版本的mysql-connector-java可能不支持这种身份验证方式。

    排查步骤

    • 检查你的MySQL连接器版本,确保它与MySQL服务器版本兼容。
    • 修改mysql-connector-java的配置,添加allowPublicKeyRetrieval=true

2.2. “Lost connection to Mysql server at ‘waiting for initial communication packet’”错误

    可能原因:这个错误可能是由于MySQL服务器启用了DNS反向解析功能导致的。当客户端尝试连接到MySQL服务器时,服务器会尝试解析客户端的IP地址以获得其主机名,这个过程可能会因为DNS查询失败而引起连接问题。

    排查步骤

    • 检查MySQL服务器的配置文件my.cnf,确保没有启用反向DNS解析。
    • 如果问题依旧存在,尝试禁用反向DNS解析。

三. 解决方案

方案一:修改MySQL连接器配置

    步骤

    • 下载并解压最新的mysql-connector-java
    • 修改mysql-connector-javaconfig.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=falseserverTimezone=UTC参数:
      
      Connection conn = DriverManager.getConnection(
        "jdbc:mysql://localhost:3306/yourdatabase?useSSL=false&serverTimezone=UTC",
        "username", "password"
      );
      

四. 总结

通过上述步骤,您应该能够快速排查并解决本地MySQL连接失败的问题。如果在实施上述解决方案后问题仍然存在,请检查网络连接、防火墙设置或其他可能影响连接的因素。希望本文能对您有所帮助!