|
MySQL客户端登录 MySQL8 时,出现如下登录问题:
原由
从 MySQL 8.0.4 开始,MySQL 默认身份验证插件从 mysql_native_password 改为 caching_sha2_password 。相应地,libmysqlclient 也使用 caching_sha2_password 作为默认的身份验证机制。
在这之前 MySQL 5.6/5.7 使用的默认密码插件是 mysql_native_password。mysql_native_password 的特点是不需要加密的连接。该插件验证速度特别快,但是不够安全,因为,mysql_native_password 使用的是于 SHA1 算法,NIST(美国国家标准与技术研究院)在很早之前就已建议停止使用 SHA1 算法,因为 SHA1 和其他哈希算法(例如 MD5)容易被破解。
其实从 MySQL 5.6 开始就引入了更安全的认证机制:ha256_password 认证插件。它使用一个加盐密码(salted password)进行多轮 SHA256 哈希(数千轮哈希,暴力破解更难),以确保哈希值转换更安全。但是,建立安全连接和多轮 hash 加密很耗费时间。虽然安全性更高,但是验证速度不够快。
MySQL 试图结合二者的优点。于是在 MySQL-8.0.3 引入了一个新的身份验证插件 caching_sha2_password ,作为sha256_password的代替方案,在sha256_password 的基础上进行了改进补上了短板,既解决安全性问题又解决性能问题。与此同时 sha256_password将退出时代的浪潮。MySQL 预计在未来版本中将其删除。使用 sha256_password 进行身份验证的 MySQL 账户建议转为 caching_sha2_password。
所以,当你使用旧版MySQL客户端连接MySQL8服务时,由于旧版客户端不支持该插件,导致连接失败。下面是解决该问题的方案。
解决方案
方案1:更新MySQL客户端(推荐)
升级支持MySQL8.x身份认证插件caching_sha2_password的MySQL客户端。
方案2:修改用户认证插件
要解决这个问题,可以将 MySQL 数据库用户的认证插件修改为 mysql_native_password。
- 使用cmd登录MySQL
# 登录MySQL
C:\Users\lenovo>mysql -u root -P 3306 -h localhost -p
- 查看当前用户的认证插件
# 查看root用户的认证插件
SELECT user, host, plugin FROM mysql.user WHERE user = 'root';
- 修改已创建用户密码和身份认证插件
# 修改`root`@`localhost`用户的密码和身份认证插件
# 语法如下:
# ALTER USER 'your_username'@'%' IDENTIFIED WITH mysql_native_password BY 'your_password';
mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'root';
说明:
your_username 是你连接的 MySQL 用户名
your_password 是你该用户的登录密码
'%' 表示允许任意主机访问该用户
'localhsot' 表示访问本地用户
- 创建新用户并使用
mysql_native_password 插件
如果你不想修改已有用户,也可以创建一个新用户并指定使用兼容插件:
mysql> CREATE USER 'sql_user'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
# 授予指定用户的所有数据库的所有权限
mysql> GRANT ALL PRIVILEGES ON *.* TO 'username'@'host' WITH GRANT OPTION;
# 授予特定数据库的所有权限
mysql> GRANT ALL PRIVILEGES ON `database_name`.* TO 'username'@'host' WITH GRANT OPTION;
# 授予特定表的权限
mysql> GRANT ALL PRIVILEGES ON `database_name`.`table_name` TO 'username'@'host' WITH GRANT OPTION;
说明:
这里,username 是用户名,host 是用户可以从哪个主机连接(例如 localhost 或 % 表示任何主机)。
WITH GRANT OPTION 允许该用户将他们拥有的权限授予其他用户。
database_name 是数据库的名称。
- 撤销权限
mysql> REVOKE ALL PRIVILEGES ON *.* FROM 'username'@'host';
- 刷新权限
不管是更新或撤销身份验证权限,一定要刷新权限,使其生效。
mysql> FLUSH PRIVILEGES;
方案3:修改 MySQL 配置文件(可选)
如果您希望所有新用户默认使用 mysql_native_password 插件,可以修改 MySQL 的配置文件my.ini来设置默认插件为 mysql_native_password:
- 打开 MySQL 配置文件。文件所在位置 C:\ProgramData\MySQL\MySQL Server X.Y\my.ini。
- 在 [mysqld] 部分下添加或修改以下行:
[mysqld]
default-authentication-plugin=mysql_native_password
- 保存文件并重启 MySQL 服务以应用更改:
net stop MySQL && net start MySQL
使用方案2可能出现的问题
修改用户密码和加密规则时会出现如下问题:
原因是:mysql_native_password 插件(模式)在新版本中被弃用了,新插件为caching sha2 password,需要启用一下旧插件。
- 检查插件是否已安装
首先,你需要确认 mysql_native_password 插件是否已经安装在服务器上。你可以通过以下 SQL 命令查看所有已安装的插件:
mysql> SHOW PLUGINS;
查找 Name: mysql_native_password 的行,看它的 Status 是否为 ACTIVE。如果不是,你需要启用它。此时可以看到如下图没有启动插件:
- 启动插件
如果插件未激活,需要将插件状态改为【ACTIVE】;
先打开my.ini文件,在[mysqld]下面添加如下:
[mysqld]
mysql_native_password=ON
- 重启MySQL服务
在安装或启用插件后,重新启动 MySQL 服务以确保更改生效。这可以通过以下命令完成(具体命令取决于你的操作系统):
net stop MySQL && net start MySQL
- 验证更改
重新启动服务后,再次运行SHOW PLUGINS; 命令,检查 mysql_native_password 的状态是否为 ACTIVE。
来源:https://www.cnblogs.com/lisong0626/p/19418251 |