Mysql

关注公众号 jb51net

关闭
首页 > 数据库 > Mysql > MySQL8.x连接5.x

MySQL8.x连接5.x 服务器认证问题解决

作者:ruokkk

MySQL 8.0与5.x认证插件不兼容,需在客户端指定使用mysql_native_password,下面就来介绍一下如何解决,感兴趣的可以了解一下

总的来说,答案是:可以,但是需要特别注意认证方式的兼容性问题。

MySQL 8.0 引入了新的默认认证插件 caching_sha2_password,而 MySQL 5.x(及更早版本)使用的是 mysql_native_password。当你用一个 8.0 的客户端或工具去连接一个 5.x 的服务器时,主要就是解决这个认证插件不匹配的问题。

下面分几种常见场景来详细说明:

场景一:使用 MySQL 8.0 的客户端工具(如mysql命令行)连接 MySQL 5.x 服务器

这是最常见的情况。如果你直接在安装了 MySQL 8.0 的机器上执行 mysql 命令去连接 5.x 服务器,很可能会遇到类似这样的错误:

ERROR 2059 (HY000): Authentication plugin 'caching_sha2_password' cannot be loaded...

原因: 你的 8.0 客户端默认想使用 caching_sha2_password 方式去认证,但是 5.x 的服务器根本不认识这个插件,导致连接失败。

解决方案: 在连接时,明确告诉 8.0 客户端使用旧的 mysql_native_password 认证插件。

命令行示例:

# 在连接命令中添加 --default-authentication-plugin=mysql_native_password 参数
mysql -h your_mysql5_host -u your_user -p --default-authentication-plugin=mysql_native_password

这样,8.0 的客户端就会使用 5.x 服务器能理解的方式进行密码验证,从而成功连接。

场景二:使用应用程序(如 Java, Python, Node.js)的 8.0 Connector/Driver 连接 MySQL 5.x 服务器

同样的问题也会出现在各种编程语言的数据库驱动中。如果你在项目里使用了较新版本的 MySQL Connector(通常是为 MySQL 8.0 设计的),去连接一个 5.x 的数据库,也需要处理认证问题。

解决方案: 在数据库连接字符串 (Connection String) 或连接配置中,指明使用 mysql_native_password 插件。

各语言示例:

Java (JDBC Connector/J 8.x) 在 JDBC URL 中添加 defaultAuthenticationPlugin 和其他推荐参数。

String url = "jdbc:mysql://your_mysql5_host:3306/your_database?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true&defaultAuthenticationPlugin=mysql_native_password";
Connection conn = DriverManager.getConnection(url, "your_user", "your_password");

Python (mysql-connector-python)connect() 方法的参数中指定。

import mysql.connector

config = {
  'user': 'your_user',
  'password': 'your_password',
  'host': 'your_mysql5_host',
  'database': 'your_database',
  'auth_plugin': 'mysql_native_password' # <-- 关键在这里
}
cnx = mysql.connector.connect(**config)

Node.js (mysql2) 在创建连接池或连接的配置中指定。

const mysql = require('mysql2');

const pool = mysql.createPool({
  host: 'your_mysql5_host',
  user: 'your_user',
  password: 'your_password',
  database: 'your_database',
  authPlugins: { // <-- 注意这里的配置方式
    mysql_native_password: () => require('mysql2/lib/auth_plugins/mysql_native_password')()
  }
});

对于 mysql2,通常它能自动检测并处理,但如果遇到问题,可以像上面这样显式配置。

场景三:MySQL 8.0 服务器作为从库,复制 MySQL 5.x 服务器的数据

这种情况是完全支持的。这是标准的数据库升级路径。

场景四:MySQL 5.x 服务器作为从库,复制 MySQL 8.0 服务器的数据

这种情况不被支持

总结和建议

  1. 核心问题:MySQL 8.0 和 5.x 的默认认证插件不同
  2. 核心解决方案:在 8.0 的客户端、工具或驱动中,明确指定使用 mysql_native_password 作为认证插件。
  3. 复制规则:只支持从旧版本复制到新版本(5.x -> 8.0),反之不行。
  4. 长期建议:虽然通过配置可以实现连接,但这终究是一种向后兼容的临时方案。为了获得更好的性能、安全性和新功能,长远来看,最理想的做法还是将你的 MySQL 5.x 服务器逐步升级到 8.0 版本

到此这篇关于MySQL8.x连接5.x 服务器认证问题解决的文章就介绍到这了,更多相关MySQL8.x连接5.x 内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

您可能感兴趣的文章:
阅读全文