MySQL 8.4(截至 2024 年的最新 LTS 版本)引入的一项重大变更是默认不再启用 "MySQL Native Password" 插件。此外,MySQL 9.0 完全移除了该插件。

此变更会影响使用带有 mysql_native_password 认证插件的 MySQL 数据库的 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 插件的变更,从而导致上述错误。在 MySQL 9.0 中,mysql_native_password 插件被完全移除,同样会导致相同的错误。

自 PHP 7.4 起,PHP 支持 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 8.4 - 使用 mysql_native_password 插件的用户

将 mysql_native_password 用户更新为 caching_sha2_password

在具有足够权限的 MySQL 控制台中,对每个使用 mysql_native_password 插件的用户运行以下命令:

ALTER USER '<USERNAME>'@'<HOST>' IDENTIFIED WITH caching_sha2_password BY '<PASSWORD>';

将 <USERNAME>、<HOST> 和 <PASSWORD> 替换为 MySQL 用户的用户名、主机和密码。

更新认证插件后,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

请注意,mysql_native_password 插件在 MySQL 9.0 中已被移除,因此添加上述配置无效,并且可能导致配置错误,因为 mysql_native_password 配置在 MySQL 9.0 中不再有效。