返回

MySQL 连接错误:ER_NOT_SUPPORTED_AUTH_MODE 如何解决?

Linux

解决 MySQL 连接错误:ER_NOT_SUPPORTED_AUTH_MODE

问题

在使用 Node.js 连接到 MySQL 数据库时,你可能会遇到以下错误消息:

ER_NOT_SUPPORTED_AUTH_MODE: Client does not support authentication protocol requested by server. Consider upgrading MariaDB client.

错误原因

此错误通常由以下原因造成的:

  • 服务器和客户端之间的身份验证协议不兼容 :MySQL 8.0 及更高版本默认使用身份验证协议“caching_sha2_password”,而旧版本的 MySQL 使用“mysql_native_password”。
  • 客户端库版本过旧 :你的 Node.js MySQL 客户端库可能不支持较新的身份验证协议。

解决方案

按照以下步骤解决此错误:

1. 检查 MySQL 服务器版本

运行以下命令检查 MySQL 服务器的版本:

mysql --version
  • 如果版本号为 8.0 或更高,则服务器使用身份验证协议“caching_sha2_password”。

2. 升级 MySQL 客户端库

  • 如果你使用的是较旧版本的 MySQL 客户端库,请升级到最新版本。
npm install mysql2
  • 确保使用 mysql2 模块,而不是旧的 mysql 模块。

3. 设置身份验证插件

  • 如果你的 MySQL 服务器版本低于 8.0,则需要设置 authentication_plugin 选项。
var connection = mysql.createConnection({
    host     : 'localhost',
    user     : 'root',
    password : '**** **** ',
    database : 'foobarDb',
    authPlugin: 'mysql_native_password' // mysql_native_password for MySQL versions prior to 8.0
}); 

4. 使用正确的身份验证协议

  • 确保客户端库和服务器使用相同的身份验证协议。
  • 对于 MySQL 8.0 及更高版本,使用 caching_sha2_password 协议。
  • 对于较旧版本的 MySQL,使用 mysql_native_password 协议。

示例

以下是使用正确身份验证协议的 Node.js 连接代码示例:

var mysql = require('mysql');

var connection = mysql.createConnection({
    host     : 'localhost',
    user     : 'root',
    password : '**** **** ',
    database : 'foobarDb',
    authPlugin: 'caching_sha2_password' // caching_sha2_password for MySQL versions 8.0 and above
}); 

其他提示

  • 确保 MySQL 服务器正在运行并且可以从客户端访问。
  • 检查你的用户名、密码和数据库名称是否正确。
  • 如果仍然遇到问题,请尝试重新启动 MySQL 服务器。

常见问题解答

1. 为什么我会收到 ER_NOT_SUPPORTED_AUTH_MODE 错误?

  • 原因可能是服务器和客户端之间的身份验证协议不兼容,或者客户端库版本过旧。

2. 如何升级 MySQL 客户端库?

  • 使用 npm 命令:npm install mysql2

3. 如何设置身份验证插件?

  • 在连接选项中指定 authPlugin 选项,如 authPlugin: 'mysql_native_password'

4. 我应该使用哪个身份验证协议?

  • 对于 MySQL 8.0 及更高版本,使用 caching_sha2_password 协议;对于较旧版本的 MySQL,使用 mysql_native_password 协议。

5. 如果我仍然遇到问题怎么办?

  • 确保 MySQL 服务器正在运行、用户名和密码正确,并尝试重新启动服务器。