修复 MySQL 8.4 的 "mysql_native_password is not loaded" 插件未加载错误
MySQL 8.4(截至 2024 年的最新 LTS 版本)中引入的一个主要变化是,默认情况下不再启用 “MySQL Native Password” 插件。
此更改会影响使用 MySQL 数据库和 mysql_native_password
身份验证插件的 PHP 和其他应用。由于默认情况下不再加载 mysql_native_password
插件,因此导致 PHP PDO/MySQLi 连接失败。
当尝试使用不再加载的 mysql_native_password
插件连接到数据库时,PDO/MySQLi 抛出 MySQL 返回的错误:
PDO:
SQLSTATE[HY000] [1524] Plugin 'mysql_native_password' is not loaded
MySQLi:
mysqli_sql_exception Plugin 'mysql_native_password' is not loaded.
在 MySQL 8.0.34 到 8.3 上,使用 mysql_native_password
插件会导致 MySQL 错误日志中警告日志:
[Warning] [MY-013360] [Server] Plugin mysql_native_password reported: ''mysql_native_password' is deprecated and will be removed in a future release. Please use caching_sha2_password instead'
MySQL 8.4 进行了更改,不再加载 mysql_native_password
插件,这导致了上面显示的错误。
PHP 从 PHP 7.4 开始支持 caching_sha2_password
身份验证。要修复此错误,请将 MySQL 用户的身份验证插件更改为caching_sha2_password
。
使用 mysql_native_password
罗列 MySQL 用户
在 MySQL 控制台上,运行以下命令以列出使用弃用的身份验证插件的用户:
SELECT user, host, plugin from mysql.user WHERE plugin='mysql_native_password';
运行上面的命令应该列出所有使用 mysql_native_password
插件的用户:
将 mysql_native_password
用户更新到 caching_sha2_password
在具有足够权限的 MySQL 控制台上,对每个使用 mysql_native_password
插件的用户运行以下命令:
ALTER USER '<USERNAME>'@'<HOST>' IDENTIFIED WITH caching_sha2_password BY '<PASSWORD>';
使用 MySQL 用户名、主机和密码替换 <USERNAME>
、<HOST>
和 <PASSWORD>
。
认证插件更新后,PHP 和其他应用可以通过 caching_sha2_password
插件连接到数据库。
重新启用 MySQL Native Password 插件
虽然 MySQL 8.4 默认不再启用 mysql_native_password
插件,你仍然可以启用该插件。不推荐这么做除非 PHP 应用在 PHP 7.3 或者更早的版本上运行,这些旧版本无法使用 caching_sha2_password
插件。
要启用 mysql_native_password
插件,请在 MySQL 配置文件的 [mysqld]
区域添加以下内容并重启 MySQL 服务。
在基于 Debian/Ubuntu 的系统中,该文件位于 /etc/mysql/
目录。推荐为此创建新文件,比如 /etc/mysql/conf.d/enable-mysql-native-password.cnf
。
# Enable mysql_native_password plugin
[mysqld]
mysql_native_password=ON