mysql 8.4(截至 2024 年的最新 LTS 版本)中引入的主要變化之一是默認(rèn)情況下不再啟用“MySQL 本機(jī)密碼”插件。此外,MySQL 9.0完全刪除了這個插件。 此更改會影響 php 和其他使用 MySQL 數(shù)據(jù)庫以及 mysql_native_password 身份驗證插件的應(yīng)用程序。由于默認(rèn)情況下不再加載 mysql_native_password 插件或根
MySQL 8.4(最新的 LTS)中引入的主要更改之一 截至 2024 年發(fā)布)的問題是“MySQL 本機(jī)密碼”插件沒有 默認(rèn)啟用時間更長。此外,MySQL 9.0刪除了這個插件 完全。
此更改會影響 PHP 和其他使用 MySQL 數(shù)據(jù)庫和 mysql_native_password 身份驗證插件的應(yīng)用程序。由于默認(rèn)情況下不再加載 mysql_native_password 插件或根本不可用,PHP pdo/mysqli 連接失敗。
嘗試使用不再加載的 mysql_native_password 插件連接到數(shù)據(jù)庫時,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 插件會導(dǎo)致MySQL 錯誤中記錄的警告log:
[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 進(jìn)行了更改,不再加載 mysql_native_password 插件,這導(dǎo)致了上面顯示的錯誤。在 MySQL 9.0 上,mysql_native_password 插件被完全刪除,這也會導(dǎo)致相同的錯誤。
PHP 從 PHP 7.4 開始支持 caching_sha2_password 身份驗證。要修復(fù)此錯誤,請將 MySQL 用戶的身份驗證插件更改為 caching_sha2_password。
使用 mysql_native_password 列出 MySQL 用戶
在 MySQL 控制臺上,運行以下命令以列出使用已棄用的身份驗證插件的用戶:
SELECT?user,?host,?plugin?from?mysql.user?WHERE?plugin='mysql_native_password';
運行上述命令應(yīng)列出所有使用mysql_native_password 插件:
將 mysql_native_password 用戶更新為 caching_sha2_password
在具有足夠權(quán)限的 MySQL 控制臺上,使用 mysql_native_password 插件對每個用戶運行以下命令:
ALTER?USER?'<username>'@'<host>'?IDENTIFIED?WITH?caching_sha2_password?BY?'<password>';</password></host></username>
更換
身份驗證插件更新后,PHP 和其他應(yīng)用程序?qū)⒛軌蛲ㄟ^以下方式連接到數(shù)據(jù)庫: caching_sha2_password 插件。
重新啟用 MySQL 本機(jī)密碼插件
雖然 MySQL 8.4 不再啟用默認(rèn)情況下 mysql_native_password 插件,仍然可以啟用此插件。不建議這樣做,除非 PHP 應(yīng)用程序運行 PHP 7.3 或更早版本,否則無法使用 caching_sha2_password 插件。
要啟用 mysql_native_password 插件,請將以下內(nèi)容添加到 [mysqld] 部分MySQL 配置文件并重新啟動 MySQL 服務(wù)器服務(wù)。
在基于 Debian/Ubuntu 的系統(tǒng)上,此文件位于 /etc/mysql/目錄。建議為此創(chuàng)建一個新文件(例如,名為 /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,所以添加上面的配置不起作用,可以 導(dǎo)致配置錯誤,因為 mysql_native_password 配置在 MySQL 9.0 上不再有效。