连接 MySQL 8.0 时,加密方式不兼容的解决方法

问题#

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 所在容器运行迁移数据库命令,迁移成功!

参考#

本作品采用《CC 协议》,转载必须注明作者和本文链接
Was mich nicht umbringt, macht mich stärker
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
讨论数量: 4

php 不知道何时才能支持 mysql8 的强密码

5年前 评论

这改动有点大啊

5年前 评论

@lovecn 按理说,只要把加密方式改为 mysql_native_password 就可以了,可以是在配置文件中配置,也可以运行时以这种加密方式启动。我是尝试了好多次,多管齐下才成功设置过来。

5年前 评论

这又是一个大坑啊!我日,原来这么多坑!我又挖坑,挖了好久!

5年前 评论