連線 MySQL 8.0 時,加密方式不相容的解決方法

tsin發表於2019-10-08

問題

laravel專案使用MySQL 8.0資料庫(放在docker裡面),執行php artisan migrate後報錯:

Illuminate\Database\QueryException  : SQLSTATE[HY000] [2054] The server requested authentication method unknown to the client (SQL: select * from information_schema.tables where table_schema = weibo and table_name = migrations and table_type = 'BASE TABLE')

執行php artisan migrate -v檢視更詳細資訊如下:

 Exception trace:

  1   PDOException::("PDO::__construct(): The server requested authentication method unknown to the client [caching_sha2_password]")
      /www/weibo/vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php:70
.
.
.

原因

Google了一番,原因是MySQL 8.0使用了新的密碼加密方式:caching_sha2_password,而許多客戶端還不支援這種方式,比如php的PDO擴充套件。

解決

這裡只說明在Docker環境下的解決方法,其他環境大概類似。

  • 修改docker-compose.ymlmysql服務部分,新增一行:

     command: --default-authentication-plugin=mysql_native_password
  • my.cnf配置檔案中[mysqld]下新增一行:
    default-authentication-plugin=mysql_native_password
  • 重新構建服務,依次執行:docker-compose down, docker-compose up -d
  • 執行 docker container exec -it <container_name or id> /bin/bash 進入mysql所在的容器。登入root賬號:mysql -u root -p <password>,登入mysql後依次執行:
    ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_password';
    FLUSH PRIVILEGES;

    最後,在php-fpm所在容器執行遷移資料庫命令,遷移成功!

參考

Was mich nicht umbringt, macht mich stärker

相關文章