MySQL 8.0 上的 phpMyAdmin

84

更新
新的phpMyAdmin版本已解决此问题。我已经成功测试过phpMyAdmin 5.0.1。


我已安装了MySQL 8.0服务器和phpMyAdmin,但在尝试从浏览器访问时出现以下错误:

#2054 - The server requested authentication method unknown to the client
mysqli_real_connect(): The server requested authentication method unknown to the client [caching_sha2_password]
mysqli_real_connect(): (HY000/2054): The server requested authentication method unknown to the client

我想这可能与MySQL采用了强密码和相对较新的版本有关。

但是我并不了解最先进的驱动程序和连接配置。

是否有人遇到过同样的问题并解决了呢? :D


1
你正在使用哪个版本的PHP?我敢打赌这是一个驱动级别的问题,因为phpMyAdmin正在使用mysqli - tadman
PHP 版本 7.0.27-0 - Lucas Noetzold
18个回答

125

使用 root 用户登录 MySQL 控制台:

root@9532f0da1a2a:/# mysql -u root -pPASSWORD

并更改那里的密码验证插件:

mysql> ALTER USER root IDENTIFIED WITH mysql_native_password BY 'PASSWORD';
Query OK, 0 rows affected (0.08 sec)

关于MySQL 8.0首选身份验证插件的更多信息可在MySQL 8.0参考手册中查看。

https://dev.mysql.com/doc/refman/8.0/en/upgrading-from-previous-series.html#upgrade-caching-sha2-password

该插件在 docker 化环境下表现完美:

docker run --name mysql -e MYSQL_ROOT_PASSWORD=PASSWORD -p 3306:3306 -d mysql:latest

docker exec -it mysql bash

mysql -u root -pPASSWORD

ALTER USER root IDENTIFIED WITH mysql_native_password BY 'PASSWORD';

exit

exit

docker run --name phpmyadmin -d --link mysql:db -p 8080:80 phpmyadmin/phpmyadmin:latest

现在您可以使用root / PASSWORD登录http://localhost:8080上的phpMyAdmin。


mysql/mysql-server

如果您正在使用mysql/mysql-server Docker镜像。

但请记住,这只是在开发环境中的“快速而肮脏”的解决方案。更改MySQL首选身份验证插件并不明智。

docker run --name mysql -e MYSQL_ROOT_PASSWORD=PASSWORD -e MYSQL_ROOT_HOST=% -p 3306:3306 -d mysql/mysql-server:latest
docker exec -it mysql mysql -u root -pPASSWORD -e "ALTER USER root IDENTIFIED WITH mysql_native_password BY 'PASSWORD';"
docker run --name phpmyadmin -d --link mysql:db -p 8080:80 phpmyadmin/phpmyadmin:latest

2018年10月4日更新的解决方案:

通过取消注释/etc/my.cnf中的default_authentication_plugin=mysql_native_password设置,更改MySQL默认身份验证插件。

使用需谨慎

docker run --name mysql -e MYSQL_ROOT_PASSWORD=PASSWORD -e MYSQL_ROOT_HOST=% -p 3306:3306 -d mysql/mysql-server:latest
docker exec -it mysql sed -i -e 's/# default-authentication-plugin=mysql_native_password/default-authentication-plugin=mysql_native_password/g' /etc/my.cnf
docker stop mysql; docker start mysql
docker run --name phpmyadmin -d --link mysql:db -p 8080:80 phpmyadmin/phpmyadmin:latest

2019年1月30日更新的解决方法

docker run --name mysql -e MYSQL_ROOT_PASSWORD=PASSWORD -e MYSQL_ROOT_HOST=% -p 3306:3306 -d mysql/mysql-server:latest
docker exec -it mysql sed -i -e 's/# default-authentication-plugin=mysql_native_password/default-authentication-plugin=mysql_native_password/g' /etc/my.cnf
docker exec -it mysql mysql -u root -pPASSWORD -e "ALTER USER root IDENTIFIED WITH mysql_native_password BY 'PASSWORD';"
docker stop mysql; docker start mysql
docker run --name phpmyadmin -d --link mysql:db -p 8080:80 phpmyadmin/phpmyadmin:latest

默认身份验证插件(default_authentication_plugin)

2021年9月13日更新的解决方案

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

  • 引号需要保留 *

28
祝福你。我浪费了很多时间试图弄清楚这个问题。顺便说一下,在MacOS上使用Brew和phpMyAdmin时,我必须运行以下命令:ALTER USER root@localhost IDENTIFIED WITH mysql_native_password BY 'secret'。(否则我会得到“ERROR 1396 (HY000): Operation ALTER USER failed for 'root'@'%'”的错误提示) - user64141
1
我尝试了这些技巧,并使其正常工作。然后我移动了mysql文件夹,现在错误又出现了,并且它无法消失。还可能有什么别的问题? - Kjeld Flarup
请尝试我的更新解决方案。您所说的“移动了mysql文件夹”是什么意思? - András Szabácsik
1
输入 ALTER USER root IDENTIFIED WITH mysql_native_password BY 'PASSWORD'; 后,我收到以下错误:ERROR 1396 (HY000): Operation ALTER USER failed for 'root'@'%'。由于我不允许 root % 进行远程访问,那么在这里我应该修复什么? - Pathros
9
@Pathros,您应该执行以下操作:ALTER USER root@'localhost' IDENTIFIED WITH mysql_native_password BY 'PASSWORD'; ...以便直接指定本地主机。 - frin
显示剩余5条评论

34

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

通过命令行进行登录,之后它就会正常工作。


最佳答案!!! - Ramis
我认为这个答案可行,而不是选择的答案,因为它使用了'root'@'localhost'而不仅仅是root。 - Dylan Glockler

18

我通过以下步骤解决了这个问题:

  1. 在my.cnf的[mysqld]部分添加default_authentication_plugin = mysql_native_password
  2. 输入mysql并创建一个新用户,例如 CREATE USER 'root'@'localhost' IDENTIFIED BY 'password';
  3. 根据需要授予权限。例如,GRANT ALL PRIVILEGES ON * . * TO 'root'@'localhost';,然后执行FLUSH PRIVILEGES;
  4. 使用新用户登录phpmyadmin

我尝试使用mysql_native_password简单创建用户,但mysqli仍然无法连接。你必须更改default_authentication_plugin才能使其正常工作,就像user1706897的帖子中所描述的那样。我正在为这个答案点赞。 - PeteH
@PeteH - 你重启了 MySQL 守护进程吗? - sneaky
我不相信我重新启动了守护进程,但这样做也无妨。 - PeteH
霹雳!最佳答案!就是这样做。谢谢! - GTodorov

17

另一个想法:只要phpMyAdmin和其他PHP工具不能与之配合使用,只需将此行添加到文件/etc/mysql/my.cnf中即可

default_authentication_plugin = mysql_native_password

参见: Mysql Ref

我知道这是一个安全问题,但如果工具无法使用caching_sha2_password怎么办?


嗯,当我考虑这个问题时,它并不是一个安全问题,因为在v8之前,它总是使用mysql_native_password。 - sneaky
1
这个ini设置甚至不能帮助MySQL 8.0.11 GA和最新版本的PHPMyAdmin 4.8.0.1。 PHPMyAdmin仍然会抛出错误:mysqli_real_connect():服务器请求客户端不知道的身份验证方法[caching_sha2_password]。 - Slava
好像更改没有生效。你重启了MySQL服务器并且确定没有其他配置文件吗? - sneaky
1
是的,重新启动了服务,重启了服务器,并在MySQL 8.0.11上进行了全新的安装,在安装程序UI中可以设置身份验证方法。但没有帮助。我已成功连接到新安装的服务器,并在Workbench 8.0.11-rc中的“用户和权限”下看到默认选择了“caching_sha2_password”作为root用户。我认为这就是问题所在。每个用户的设置可能会覆盖“default_authentication_plugin”配置。并且在安装期间,无论如何默认值都会将root设置为sha2。 - Slava
抱歉,没有看到你的回答。如果你是从早期版本升级过来的,也许需要更新表结构?这在https://dev.mysql.com/doc/refman/8.0/en/upgrading-strategies.html中有描述。我按照第8和9步骤启动了一个安全服务器,并运行了mysql_upgrade命令。这花费了很长时间... - sneaky

13

我访问了系统

偏好设置 -> mysql -> 初始化数据库 -> 使用传统密码加密(而不是强密码加密)-> 输入相同的密码

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


8
我用András的回答基本上解决了我的问题:
1- 用root用户登录MySQL控制台:
root@9532f0da1a2a:/# mysql -u root -pPASSWORD

"输入根用户密码进行授权。
2- 我创建了一个新用户:"
mysql> CREATE USER 'user'@'hostname' IDENTIFIED BY 'password';

3- 给新用户授予所有权限:
mysql> GRANT ALL PRIVILEGES ON *.* To 'user'@'hostname';

4- 使用密码更改身份验证插件:
mysql> ALTER USER user IDENTIFIED WITH mysql_native_password BY 'PASSWORD';

现在,phpMyAdmin可以正常记录新用户的登录。

7
为了解决这个问题,我只需在我的mysql控制台中运行一个查询。要做到这一点,请使用以下方法登录mysql控制台。
mysql -u {username} -p{password}

接下来我只需要运行以下查询:

ALTER user '{USERNAME}'@'localhost' identified with mysql_native_password by '{PASSWORD}';

当我运行这个查询时,我收到了一个消息,说明查询已执行。然后使用用户名/密码登录PHPMYADMIN。

1
我花了两天时间寻找解决我的问题的方法,最终这个答案帮助了我。我使用的是Mac Mojave系统,mysql 8和php 7.2。谢谢! - SlickRemix
我仍然无法让它工作。我运行了这个查询,但仍无法登录。我收到相同的认证方法错误。这个查询对我没有任何改变吗?mysql> ALTER user 'root'@'localhost' identified with mysql_native_password by '<root pw>'; 查询成功,0行受影响(0.01秒) - J. Scott Elblein
1
好的,结果我必须使用“%”而不是“ localhost”,它仍然会显示0行受影响,但确实会更改它。 - J. Scott Elblein

7
如果您正在使用官方的MySQL Docker容器,有一个简单的解决方案:
将以下行添加到您的docker-compose服务中:
command: --default-authentication-plugin=mysql_native_password

示例配置:

mysql:
     image: mysql:8
     networks:
       - net_internal
     volumes:
       - mysql_data:/var/lib/mysql
     environment:
       - MYSQL_ROOT_PASSWORD=root
       - MYSQL_DATABASE=db
     command: --default-authentication-plugin=mysql_native_password

5
我曾经遇到过这个问题,在Windows中找不到任何ini文件,但对我有效的解决方法非常简单。
1. 打开mysql安装程序。
2. 重新配置mysql服务器,这是第一个链接。
3. 进入身份验证方法。
4. 选择“传统身份验证”。
5. 输入您的密码(下一个字段)。
6. 应用更改。
就是这样,希望我的解决方案也能对您有所帮助!

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