MySQL升级后从mysql_native_password认证模块更改为caching_sha2_password

MySQL 8.4 LTS 开始默认使用caching_sha2_password认证插件,来取代不太安全的mysql_native_password认证插件。网上很多的文章解决这个问题的方法,是启动MySQL的时候,加上--mysql-native-password=ON选项,以回退并继续使用mysql_native_password认证插件。然而,在MySQL 9.0以后,mysql_native_password认证插件不再被支持。所以更好的解决办法,还是彻底更改认证方式为caching_sha2_password

首先升级MySQL到8.4+后正常启动,默认认证模块会变更为caching_sha2_password

DROP USER 'foo'@'%';
CREATE USER 'foo'@'%' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON BAR.* TO 'foo'@'%';
FLUSH PRIVILEGES;

注意:
1. 只是 DELETE FROM mysql.user where User="foo"; FLUSH PRIVILEGES; 可能会导致CREATE USER失败,需要先DROP USER
2. 如果升级后无法登陆,可以启动MySQL的时候加上--skip-grant-tables以临时跳过认证。
3. 对于root用户,可以加上WITH GRANT OPTION

GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;

客户端这边,以PHP为例,需要确认支持caching_sha2_password认证插件。

<?php
phpinfo();
?>

会显示:

mysqlnd - Loaded plugins:
auth_plugin_caching_sha2_password

如果不支持,请升级版本。