一、问题描述
在安装了 MySQL 8.x
的版本后,修改了 root
的远程连接限制,并通过 Navicat
客户端进行数据库的连接报错。然而用 Navicat
连接 5.x
的 MySQL
版本就没有这个问题。
-
错误信息
error 2059: Authentication plugin 'caching_sha2_password' cannot be loaded: /usr/lib64/mysql/plugin/caching_sha2_password.so: cannot open shared object file: No such file or directory
二、问题分析
-
运行环境
CentOS 7 + MySQL 8.0.20
-
查看
MySQL 8.x
的认证插件mysql> select version(); +-----------+ | version() | +-----------+ | 8.0.20 | +-----------+ 1 row in set (0.00 sec) mysql> show variables like 'default_authentication_plugin'; +-------------------------------+-----------------------+ | Variable_name | Value | +-------------------------------+-----------------------+ | default_authentication_plugin | caching_sha2_password | +-------------------------------+-----------------------+ 1 row in set (0.01 sec) mysql> select host,user,plugin from mysql.user; +-----------+------------------+-----------------------+ | host | user | plugin | +-----------+------------------+-----------------------+ | % | root | caching_sha2_password | | localhost | mysql.infoschema | mysql_native_password | | localhost | mysql.session | mysql_native_password | | localhost | mysql.sys | mysql_native_password | | localhost | root | caching_sha2_password | +-----------+------------------+-----------------------+ 5 rows in set (0.00 sec)
-
查看
MySQL 5.x
的认证插件mysql> select version(); +------------+ | version() | +------------+ | 5.7.15-log | +------------+ 1 row in set (0.00 sec) mysql> show variables like 'default_authentication_plugin'; +-------------------------------+-----------------------+ | Variable_name | Value | +-------------------------------+-----------------------+ | default_authentication_plugin | mysql_native_password | +-------------------------------+-----------------------+ 1 row in set (0.01 sec) mysql> select host,user,plugin from mysql.user; +-----------+-----------+-----------------------+ | host | user | plugin | +-----------+-----------+-----------------------+ | localhost | root | mysql_native_password | | localhost | mysql.sys | mysql_native_password | | % | root | mysql_native_password |
-
通过以上可以看出
MySQL 8.x
版本默认的认证方式是caching_sha2_password
,而MySQL 5.x
版本默认的认证方式是mysql_native_password
。
三、解决方案
-
将
MySQL 8.x
版本的指定需要采用客户端或者低版本程序连接的数据库用户修改为mysql_native_password
认证方式# 修改认证方式 ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '密码'; # 刷新权限 FLUSH PRIVILEGES;
-
如果是新创建的用户也需要采用旧的认证方式,可以采用以下创建用户的脚本
# 创建指定环境可以访问的数据库账号,ip 可以用具体的ip 或者 ip 段来代替,通配符为 % CREATE USER 'username'@'ip' IDENTIFIED WITH mysql_native_password BY '密码';
-
为用户授权
# 语法 GRANT privileges ON databasename.tablename TO 'username'@'host' # 参数说明 privileges:用户的操作权限,如SELECT,INSERT,UPDATE等,如果要授予所的权限则使用ALL databasename:数据库名 tablename:表名,如果要授予该用户对所有数据库和表的相应操作权限则可用*表示,如*.* # 示例 GRANT SELECT, INSERT ON test.user TO 'pig'@'%'; GRANT ALL ON *.* TO 'pig'@'%'; # 刷新权限 FLUSH PRIVILEGES;