不支持的认证模式错误 - MySQL服务器

83

连接Node.js服务器MySQL数据库失败


我在一个Node.js服务器上安装了MariaDB,但是决定改用SQL数据库。我卸载并完全删除了MariaDB,随后安装了" Community Ed.""MySQL Database"。完成整个**MySQL设置过程后,我尝试使用默认的JS数据库连接代码片段(下面的代码片段中发布了我的DB连接文档)通过JavaScript文档连接到数据库,然而每次连接都失败了。



以下是我收到的连接错误消息:



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



我使用的JS/SQL连接片段:



    var mysql = require('mysql');
    
    var connection = mysql.createConnection({
        host     : 'localhost',
        user     : 'root',
        password : '********',
        database : 'foobarDb'
    }); 


将MYSQL版本从8.0.13降级到5.7.24.0对我解决了这个问题。 - Pol Vandekasseie
1
MySQL 8.0客户端不支持服务器请求的身份验证协议。 - Yossarian42
1
使用mysqljs/mysql时发生错误的详细解释,请参见 https://dev59.com/plUL5IYBdhLWcg3wmpDH#56509065。 - Yossarian42
13个回答

143

对于MySQL v8.0,请使用以下内容:

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password'

似乎重置了数据库的模式级凭据。 - Dave K
应该先禁用 skip-grant-tables。 - Hee
11
这个答案不太合适,因为它是从这篇文章中提取的:https://dev59.com/plUL5IYBdhLWcg3wmpDH。我建议您直接查看该文章,而不是这篇文章。 - JCollier
1
我第一次看到这篇帖子,做些实际的事情... - Archil Labadze
我们应该将“root”替换为我们的用户名,“password”替换为我们想要分配的密码。完成后,请执行FLUSH PRIVILEGES;以激活它。 - hariAnitha

36
你可以使用包mysql2来替换mysql。我也遇到了同样的问题,使用mysql2对我有用。
你可以通过npm i mysql2命令安装这个包。

3
完美的解决方案 - 谢谢 - Bruno
3
这是正确的答案!更改数据库服务器只是一种解决方法而不是解决方案。MySQL 8使用新的身份验证协议。mysql2支持新协议,但mysqljs/mysql不支持。 - Jingshao Chen
3
这就像魔法一样好用!!谢谢。我刚刚安装了mysql2,只改变了这个import mysql=require("mysql2") - Tushar saxena
2
如此被低估的答案,运作得像魅力一样。 - Grijan
2
这对我有用,谢谢!正确答案! - omeatai

33

enter image description here

您需要重新配置快速操作设置,方法是按下面截图中显示的"重新配置链接"。然后,在v5.1中选择"传统密码"


错误的原因:


你安装了最新的MySQL版本,"MySQL Version",即v8.0。最新版本有一个不同的加密插件用于在登录时验证用户身份。5.6和5.1则回退到以前的加密算法。请注意,5.6 & 5.1有几个由Oracle报告的安全漏洞

1
我正在使用终端来运行和管理我的数据库,所以这不是一个选项。不过还是谢谢 ;) - João Gouveia
1
这对我起了作用,但是只有在我在MySQL Workbench中创建了一个新用户和连接之后才可以。我无法使用现有的连接使它工作。但暂时够好了。感谢你的提示。 - Jesper Kristiansen

25

这个问答主题中排名最高的答案在大多数情况下都是有效的,但它们没有组织,这至少可以这么说。有一个解决方案在这里,不过,这个解决方案是分散在其他三个答案中的各种碎片。为了提供一个单一的解决方案、更有帮助且节省时间,我将尝试用清晰、简明和有序的方式撰写答案。我将讨论Ubuntu用户遇到的整个问题,并补充其他答案中没有包含的有用信息,以帮助读者理解他们所遇到的问题。


先来看看问题:这不是SQL的问题,而是Ubuntu的问题

对于您遇到的问题,事实上(大多数软件开发人员/IT专业人员可能已经知道的事实)是,在Ubuntu中,'ROOT'用户没有密码,任何拥有$ sudo权限的人都可以访问它。为了给那些可能对我提出的某些语义新手的任何人提供明确的澄清;Ubuntu用户使用sudo -i 命令注册为root用户,而存在的每个其他Linux发行版都使用带密码的用户ID。事实上,我从来没有想到过需要成为root用户做除数据库管理之外的任何事情,而且总是在我首次将数据库安装到服务器时使用它,虽然我的经验可能远不及其他一些IT专业人士。我的观点是,通常仅使用sudo就可以完成所有工作,但在这种情况下,它有问题,因此需要注意以下重要事项:


问题:


Ubuntu缺少“ROOT密码”,这就是为什么每个遇到我们正在讨论的问题的人都运行一个Ubuntu操作系统的发行版/ SHELL。除非我们重新编写Ubuntu内核以及操作系统中的几乎所有其他内容,否则我们无法为Ubuntu SHELL提供"root密码"


解决方案:

我们可能无法为Ubuntu SHELL提供根密码,但我们可以并且将会为MySQL提供一个'ROOT PASSWORD'





要执行解决方案,您需要以下内容:

  1. Node.js v12+
  2. NPM(可能需要v5+,但不要引用我)
  3. MySQL v8.0+(显然)
  4. MySQL驱动程序(从npm)



确认:

如果您还没有清单上的所有内容,您无法确定这是否是您正在处理的问题。
如果您已经拥有以下所有内容

并且您正在运行Ubuntu发行版,则应该会收到一个错误消息,它可能看起来像我在修复此问题时收到的那个消息。

我的错误消息如下:
ERROR: (28000): Access denied for user 'ajc'@'localhost' 
ERROR: ERROR_NOT_SUPPORTED_AUTH_MODE: Client does not support
authentication protocol requested by server; consider upgrading 
MySQL client

'Client does not support authentication protocol requested by server; consider upgrading MySQL client

如果您仍在阅读,那么您可能正在正确的地方。
  1. 要开始解决问题,请创建一个空的Node.js项目,并使用NPM将MySQL驱动程序作为依赖项安装到其中(您应该知道如何做到这一点,因为您必须这样做才能出现这个问题)。添加JavaScript .js文件。将文件命名为sqltest.js或类似名称。

  2. 将下面的代码添加到您刚刚创建的文件中。

let mysql = require('mysql');

let connection = mysql.createConnection({
    host     : 'localhost',
    user     : 'root',
    password : '********',
    database : 'DB_App_00',
});

connection.connect(function(err) {
    if (err) {
      return console.error('error: ' + err.message);
    }
  
    console.log('Connected to the MySQL server.');
  });

  1. 在名为“createConnection”的方法中,有一个JSON对象参数,保存着用于建立有效连接到MySQL数据库服务器的凭证值。用户必须等于“root”,并且数据库必须存在。另外,在稍后的测试中,还要向数据库添加测试表,并填充一些虚假数据。

  2. 现在打开终端窗口,并执行典型的更新和升级操作,这很重要,因此每个教程都要求你这样做。

~$: sudo apt update
~$: sudo apt upgrade

完成升级后,请在终端中输入以下命令:
~$: sudo mysql -u root

  1. 它应提示您输入Ubuntu密码,请输入并[ENTER]。

下一步非常重要:
  1. 现在是被认为是解决问题的关键步骤。你的终端应该已经打开,并且你应该在MYSQL服务器内,使用'root'用户。终端应该在一个空的mysql命令行下闪烁光标。在CMDL中复制并粘贴此内容:

mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'ChoosePassword';

mysql> FLUSH PRIVILEGES;

  1. 接下来很明显,将“ChoosePassword”更改为你记得住的密码,同时保留单引号内的密码不变。不要更改任何其他内容,按[ENTER]键。

  2. 如果您正确地执行了上述步骤,现在您拥有一个具有自己密码的MySQL 'ROOT USER'。通过在Ubuntu CMDL中复制并粘贴以下内容来测试:

 ~$: mysql -u root -p 
  • 系统会提示您输入新密码,请输入并按[ENTER]

……现在您已经登录,请退出。

mysql>exit
  1. 回到你的“testsql.js”文件中,将凭据更改为用户的根凭据,密码更改为您的密码,有效数据库,主机更改为localhost,除非您有不同主机名的特殊需要。

let connection = mysql.createConnection({
    host     : 'localhost',
    user     : 'root',
    password : '********',
    database : 'DB_App_00',
});


  1. 现在使用node来运行node测试文件
~$: node testsql.js
最终结论:

如果它显示未连接,说明您做错了什么,但如果一切顺利,您应该可以连接。在我使其正常工作之前花费了一些时间和精力,但这篇回答应该可以帮助您节省阅读所有其他不完整的答案所需的时间。


如果我在 MacOS 上遇到这个问题,那么它仍然/真的是“Ubuntu问题”吗? - Ian Mbae
@IanMbae 我应该表述得更清楚。这个问题可能会出现在其他人身上,但通常可以通过登录“ROOT用户”轻松解决,然而,Ubuntu没有可访问的Root用户帐户。我相信MacOS有一个root用户。现在,我离Unix专家还很远,特别是当涉及到Mac时。我想此时我会有几个问题,那就是...您能否登录MacOS的ROOT,如果可以,您能作为ROOT用户修复问题吗?如果您无法登录root或无法作为root修复问题,则需要编辑答案。 - JΛYDΞV

9

您可以将现有用户更改为使用mysql_native_password,也可以创建新用户。

CREATE USER 'new_user'@'%' IDENTIFIED WITH mysql_native_password BY '***';
GRANT USAGE ON *.* TO 'new_user'@'%';
ALTER USER 'new_user'@'%' REQUIRE NONE WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0;
GRANT ALL PRIVILEGES ON `new_user`.* TO 'new_user'@'%';
FLUSH PRIVILEGES;

将 new_user 替换为您的新用户名,并设置您的密码。

现在,您可以使用 mysql 包从 node 访问 mysql。

 npm install mysql

建议使用连接池来使用这个包。


7

我发现有些MySQL版本在建立连接时的身份验证有些混乱。我所需要做的就是在 CreateConnection(...) 函数中的凭据中添加一行 "insecureAuth" : true

var connection = mysql.createConnection({
  host     : 'localhost',
  user     : 'root',
  password : '********',
  database : 'vod_bill_database',
  insecureAuth : true
}); 

错误已经消失了,客户端成功连接。

11
无法在Ubuntu上使用MySQL 8.0,因为截至本评论日期,它仍未得到mysql.js的支持。 - Youkko
8
请勿使用此配置!这种方法是为了保持与需要旧的、非常不安全的身份验证方法兼容的版本的兼容性。虽然这种黑客方法可能有效,也可能无效,但它是一种“不安全”的身份验证方法,应尽可能避免使用。考虑到名称,这应该是显而易见的。如果您想自己查看API和连接选项,请点击以下链接:https://www.npmjs.com/package/mysql#connection-options - JΛYDΞV

4

首先运行这段代码 ->

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';

第二个

flush privileges;

0

尝试使用旧版本的mysql,如5.6.40,它默认使用SHA256_password身份验证,而新版本8.0默认使用更安全的sha2_password身份验证,因此会出现身份验证协议错误MYSQL安装程序5.6.40


0

你可以做到

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password'

ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'password'

FLUSH PRIVILEGES;

检查 mysql root 用户已识别

select user,host,plugin from user;

+------------------+-----------+-----------------------+
| user             | host      | plugin                |
+------------------+-----------+-----------------------+
| root             | %         | mysql_native_password |
| mysql.infoschema | localhost | caching_sha2_password |
| mysql.session    | localhost | caching_sha2_password |
| mysql.sys        | localhost | caching_sha2_password |
| root             | localhost | mysql_native_password |
+------------------+-----------+-----------------------+


0

黄色的兄弟们,你们好!

// mysql.ts
const pool = mysql.createPool({
    connectionLimit: 10,
    host: "localhost",
    user: "root",
    password: "password",
    database: "rest-resume-api",
});

然后我有一个类似于docker-compose的文件

# docker-compose.yml

version: '3.3'

services:
  db:
    image: mysql
    restart: always
    command: --default-authentication-plugin=mysql_native_password
    environment:
      MYSQL_DATABASE: 'rest-resume-api'
      MYSQL_USER: 'root'
      MYSQL_ROOT_PASSWORD: 'password'
    ports:
      - '3306:3306'
    expose:
      - '3306'
    volumes:
      - my-db:/var/lib/mysql2
volumes:
  my-db:


1
它确实帮了我,我很感激! - Ismail
1
如果有人在使用Docker,这是正确的。对我有效。 - Anuruddha Thennakoon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接