解决 PHP 7.2.8 + MySQL 8.0.12 连接失败的问题

这两天又反复遇到这个问题,先写解决方案:

1. 使用 caching_sha2_password  插件

修改用户密码,并且用插件生成,可以解决 WordPress 的问题。

ALTER USER 'user'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'password';

2. 修改 my.cnf,使用原生密码

使用 Laravel + MySQL 8.0 的时候,遇到

SQLSTATE[HY000] [2054] The server requested authentication method unknown to the client

修改 /etc/mysql/my.cnf (我是 Ubuntu 16.04),添加下面一行:

[mysqld]
default_authentication_plugin= mysql_native_password

然后重置密码:

ALTER USER 'user'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';

今天早上例行维护服务器,其实就是 ssh 上去然后 apt update & get upgrade。跟以前一样,一路回车按下来,更新完成。然后通过 WordPress 后台更新 WordPress,竟然打不开了!报错:

Error establishing a database connection

很明显 PHP 连接 MySQL 失败了。会是什么原因呢?我们知道 MySQL 8.0 之后默认开启密码加密,所以要用 mysql_native_password 插件。按照 WordPress + MySQL 8 里的记录搞了一遍,还是不行。

但是直接 mysql -uroot -p 可以正常操作,所以还是怀疑问题出在密码这块儿。于是反复尝试,甚至专门写了独立的测试文件。发现错误并不是 access denied 这样的密码问题,而是 server gone away 这样的超时错,难道不是密码?

接下来 netstat -lnp 看端口,发现 MySQL 侦听的是 tcp6,难道是端口问题?于是编辑 my.cnf

[mysqld]
bind-address = 0.0.0.0

重启之后,侦听 tcp 了,问题依旧。

于是把错误提示的第一句拿来搜:Unexpected server respose while doing caching_sha2 auth,结果看到这个 issue:Bug #76660 Cannot connect to mysql 8 using Php 7.2.8,我靠版本跟我一毛一样,难道这种新问题被我碰上了?于是重装 MySQL 5.7,妈蛋竟然装不上,因为 Oracle 给的源里没有 mysql-common-5.5 版本,靠靠靠。那就装 php7.1 吧。好在这个过程还算顺利,然后启动 php7.1-fpm,修改 nginx 的配置,restart。

问题依旧。

崩溃啊崩溃……

这个时候桌子的血槽已经见底了,老婆也来确认了我的精神状态。于是我打开山口山,准备放松一下。在 loading 的过程中,随手点开了另一个链接:Laravel Migration stalls and doesn’t do anything,翻到答案,用 caching_sha2_password 插件更新密码,怎么看怎么有戏,马上退出游戏尝试,竟然解决问题了。

至此,问题解决,从 11:42 到 14:39,将近3个小时……

如果您觉得文章内容对您有用,不妨支持我创作更多有价值的分享:


已发布

分类

来自

评论

《“解决 PHP 7.2.8 + MySQL 8.0.12 连接失败的问题”》 有 3 条评论

  1. yumls 的头像
    yumls

    perfect

    1. macran 的头像
      macran

      楼主,我用laravel,其实就是php连接MySQL8,如果是sha2加密方式没问题,可数据库客户端无法连接,换成native方式,客户端能连接,php却无法连接啦。现在没有好的解决方案吗?

      1. meathill 的头像

        文中第二部分,修改 MySQL 配置,要求用 mysql_native_password 插件。

        或者查查看你的客户端怎么支持 sha2。

欢迎吐槽,共同进步

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据