PHP与MySQL 8.0+错误:服务器请求的身份验证方法客户端未知。

228

我正在运行PHP 7.0上的MySQL版本8。

当我尝试从PHP连接到我的数据库时,出现以下错误:

连接错误:SQLSTATE [HY000] [2054] 服务器请求客户端未知的身份验证方法

PHP可能会显示此错误

警告:mysqli_connect():服务器请求客户机未知的身份验证方法[caching_sha2_password]在D:\ xampp \ htdocs \ reg \ server.php的第10行

如何解决这个问题?


我进行了一些谷歌搜索。也许这个链接有用?https://github.com/laradock/laradock/issues/1392(虽然不是同样的问题,但是错误信息相同) - Koen Hollander
对于那些遇到困难的人:当我在我的.env文件中将数据库IP配置错误时,我也遇到了这个错误信息。 - Charles Wood
8个回答

507

@穆罕默德,这通常归因于您的mysql数据库正在使用的身份验证插件。

默认情况下,出于某种原因,mysql 8默认插件是auth_socket。应用程序大多数时候都希望使用密码登录到您的数据库。

如果您尚未更改mysql默认的认证插件,则可以通过以下方式进行更改:
1. 以root身份登录mysql
2. 运行此SQL命令:

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

用你的 root 密码替换 'password'。如果你的应用程序没有使用 root 用户登录到数据库,那么请使用你的应用程序所用的用户替换上述命令中的 'root' 用户。

Digital Ocean 在此提供了更详细的说明:安装 Mysql


4
此问题的主要原因是MariaDB 8.0版本中MySQL默认身份验证插件支持发生了变化。比如,可以通过'phpinfo()'函数查看支持'PHP7.3'的MySQL身份验证插件列表:mysqlnd debug_trace, auth_plugin_mysql_native_password, auth_plugin_mysql_clear_password, auth_plugin_sha256_password。因此,需要将MySQL服务器受限账户的身份验证插件机制更改为'sha256_password'或'mysql_native_password':ALTER USER 'root'@'%' IDENTIFIED WITH sha256_password BY 'password'; - lupguo
2
我遇到了这个错误:ERROR 1396 (HY000): Operation ALTER USER failed for 'root'@'localhost'。我的密码是 ''(空的)。 - xjcl
2
谢谢。我在MySQL(8)配置文件中添加了[mysqld] default-authentication-plugin=mysql_native_password,这解决了问题。 - user7309871
这对我有用,但在macOS Big Sur,MySQL 8.0.15上有一个额外的注意事项:ALTER USER CURRENT_USER() IDENTIFIED WITH mysql_native_password BY 'password'; - Numabyte
已经通过了第一个错误信息,现在出现了以下错误: mysqli_real_connect():(HY000/1045):用户'root'@'localhost'被拒绝访问(使用密码:YES) - MC9000
显示剩余3条评论

165

你需要更改MySQL的设置。 编辑my.cnf文件,并在mysqld部分中添加以下设置:

[mysqld]
default_authentication_plugin= mysql_native_password

然后运行以下命令:

FLUSH PRIVILEGES;

上述命令将生效默认身份验证机制的更改。


46
然后重新创建用户。ALTER USER $user IDENTIFIED WITH mysql_native_password BY 'passwd'(参考ALTER USER手册页面)。 - danblack
1
$user 不是一个有效的变量。无用的。 - vincent thorpe
6
在Ubuntu上发现了my.cnf文件,位置在 /etc/mysql/my.cnf。 - Marco Floriano
1
@AkshayHazari 请关注此线程:https://dev59.com/VGgv5IYBdhLWcg3wPORm - michail_w
1
在Windows 7上,my.cnf文件在哪里? - Clarity
显示剩余6条评论

120

我尝试了很多其他解决方案,但只有这个对我有效。

感谢临时解决方法

检查你的 .env 文件

MYSQL_VERSION=latest

然后输入以下命令

$ docker-compose exec mysql bash
$ mysql -u root -p 

(以 root 用户身份登录)

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'root';
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'root';
ALTER USER 'default'@'%' IDENTIFIED WITH mysql_native_password BY 'secret';

然后进入phpmyadmin并登录:

  • 主机 -> mysql
  • 用户 -> root
  • 密码 -> root

1
这个解决方案对我来说非常有效。你也救了我的一天!我额外做的是fork mysql docker并将解决方案包含在mysql容器构建中:https://github.com/cybalex/mysql/commit/e5cb4cf80ca69066a185bfa7dfeeb44de93d4c31 - Oleksii Zymovets
1
谢谢。这对我很有帮助。我只需要那个最后的修改查询才能在Docker MySQL上运行它。 - Ankit
2
[HY000][1396]针对'默认'@'%'的操作ALTER USER失败,发生在最后一个alter...有什么想法吗? - Chris Stage
@TaioliFrancesco 谢谢您的答案,它有效,但是我们每次启动mysql容器时都必须运行这些查询吗? 有没有一种通过docker compose执行它的方法? - SlimenTN
@SlimenTN 不,只需要一次,然后容器会记住 MySQL 的设置。 - Francesco Taioli
显示剩余6条评论

15

这里的所有答案都对我没有作用。我所做的是:

  1. 重新运行安装程序。
  2. 选择产品“MySQL Server”旁边的快速操作“重新配置”。
  3. 通过选项,直到您达到身份验证方法,并选择“使用遗留身份验证方法”。

之后它就正常工作了。


2
如果您使用了安装程序,并且正在使用经典的用户名/密码方法连接到数据库,那么这种方法是可行的。 - Matt Wohler
安装程序中找不到身份验证方法 :( - Charles Wood
1
@CharlesWood 你需要使用MYSQL安装程序 https://dev.mysql.com/downloads/installer/ - 13garth

10
面对同样的问题,我无法使用mysql 8版本作为默认身份验证机制的wordpress docker容器。因为它的默认身份验证机制是caching_sha2_password而不是mysql_native_password。
为了解决这个问题,我们必须将默认身份验证机制重置为mysql_native_password。
在mysql安装中找到my.cnf文件,通常在Linux机器上位于以下位置 - /etc/mysql
编辑my.cnf文件,在[mysqld]标题下添加以下行
default_authentication_plugin= mysql_native_password
保存文件,然后使用root用户登录mysql命令行
运行FLUSH PRIVILEGES命令。

这个解决方案解决了我的问题,但我不必刷新权限。 - sianipard

2
我正在使用Laravel Lumen构建一个小应用程序。
对我来说,问题是我在.env文件中没有定义DB_USERNAME。"Original Answer"翻译成"最初的回答"。
DB_USERNAME=root

设置这个解决了我的问题。


0
在my.cnf文件中,请检查以下2个步骤。
  • 检查此值 -

    old_passwords=0;

    它应该是0。

  • 也要检查这个-

    [mysqld] default_authentication_plugin= mysql_native_password 另一个 要检查的值是确保

    [mysqld]部分应该像这样。


你在哪里可以找到“my.cnf”文件? - Tim Kruger
laradock/mysql/my.cnf - sanjaya

0
preferences -> mysql -> initialize database -> use legacy password encryption(instead of strong) -> entered same password

作为我的config.inc.php文件,重新启动了Apache服务器,它就可以工作了。我仍然对此持怀疑态度,所以我停止了Apache和MySQL服务器,然后再次启动它们,现在它可以正常工作了。

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