mysql 8.4(截至 2024 年的最新 LTS 版本)中引入的主要變化之一是默認情況下不再啟用“MySQL 本機密碼”插件。此外,MySQL 9.0完全刪除了這個插件。 此更改會影響 php 和其他使用 MySQL 數據庫以及 mysql_native_password 身份驗證插件的應用程序。由于默認情況下不再加載 mysql_native_password 插件或根
MySQL 8.4(最新的 LTS)中引入的主要更改之一 截至 2024 年發布)的問題是“MySQL 本機密碼”插件沒有 默認啟用時間更長。此外,MySQL 9.0刪除了這個插件 完全。
此更改會影響 PHP 和其他使用 MySQL 數據庫和 mysql_native_password 身份驗證插件的應用程序。由于默認情況下不再加載 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 錯誤中記錄的警告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 進行了更改,不再加載 mysql_native_password 插件,這導致了上面顯示的錯誤。在 MySQL 9.0 上,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>';</password></host></username>
更換
身份驗證插件更新后,PHP 和其他應用程序將能夠通過以下方式連接到數據庫: caching_sha2_password 插件。
重新啟用 MySQL 本機密碼插件
雖然 MySQL 8.4 不再啟用默認情況下 mysql_native_password 插件,仍然可以啟用此插件。不建議這樣做,除非 PHP 應用程序運行 PHP 7.3 或更早版本,否則無法使用 caching_sha2_password 插件。
要啟用 mysql_native_password 插件,請將以下內容添加到 [mysqld] 部分MySQL 配置文件并重新啟動 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 上不再有效。