背景

我使用以下命令在8.0版本MySQL来创建了一个新用户:

mysql> SELECT VERSION();
+-----------+
| VERSION() |
+-----------+
| 8.0.11    |
+-----------+
1 row in set (0.01 sec)

mysql> CREATE USER yhy IDENTIFIED BY '123456';
Query OK, 0 rows affected (0.17 sec)

mysql> GRANT ALL PRIVILEGES ON *.* TO 'yhy';
Query OK, 0 rows affected (0.08 sec)

系统提示我Query OK。

我在客户端上使用新用户登录也成功登入:

[root@newyork log]# mysql -u yhy -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 17
Server version: 8.0.11 MySQL Community Server - GPL

Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 

但是我在远程windows主机上面使用Navicat Premium客户端尝试连接时,客户端却报错

Authentication plugin 'caching_sha2_password' cannot be loaded’。

解决

据查在MySQL 8.0中,caching_sha2_password是默认的身份验证插件,官方解释caching_sha2_password性能和安全性都更好。

MySQL提供了两个认证插件,用于实现用户帐户密码的SHA-256散列:
  sha256_password:实现基本的SHA-256认证。
  caching_sha2_password:实现SHA-256身份验证(如sha256_password),但使用缓存以获得更好的性能,并具有其他功能以实现更广泛的适用性。

query结果显示确实如此,如下:

mysql> SELECT user,host,plugin FROM user;
+------------------+-----------+-----------------------+
| user             | host      | plugin                |
+------------------+-----------+-----------------------+
| test             | %         | caching_sha2_password |
| mysql.infoschema | localhost | mysql_native_password |
| mysql.session    | localhost | mysql_native_password |
| mysql.sys        | localhost | mysql_native_password |
| root             | localhost | caching_sha2_password |
+------------------+-----------+-----------------------+
5 rows in set (0.00 sec)

而我使用的客户端工具还没有升级,无法加载caching_sha2_password验证插件。
官方公布这些客户端和连接器已升级为支持 caching_sha2_password:

  • libmysqlclientMySQL 8.0.4或更高版本中 的客户端库。标准的MySQL客户端如 mysql和mysqladmin 是libmysqlclient基于的,所以它们也是兼容的。
  • MySQL Connector / J 8.0.9或更高版本。
  • MySQL Connector / Net 8.0.10或更高版本(通过经典的MySQL协议)。
  • MySQL Connector / Node.js 8.0.9或更高版本。

我尝试去查询5.7版本的验证插件,发现使用的是 mysql_native_password。这也是MySQL升级到8.0之后的修改,有关此更改对服务器操作的影响以及服务器与客户端和连接器的兼容性的信息,请参阅 caching_sha2_password作为首选身份验证插件。

问题原因既已确定,那么如果不想升级客户端(可能暂时难以升级,因为习惯使用Navicat Premium客户端),可以在创建新用户时使用以下句式定义使用 mysql_native_password 加密方式:

CREATE USER 'native_user'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';

如果想修改一个已创建的用户的加密方式,可以使用以下句式:

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

问题已解决,安静地等待Navicat Premium升级吧。

参考资料:
https://dev.mysql.com/doc/refman/8.0/en/caching-sha2-pluggable-authentication.html
https://dev.mysql.com/doc/refman/8.0/en/upgrading-from-previous-series.html#upgrade-caching-sha2-password

标签: none

添加新评论