编程

修复 MySQL 8.4 的 "mysql_native_password is not loaded" 插件未加载错误

4106 2024-06-01 00:04:00

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