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

今天花3个小时解决了一个升级 PHP + MySQL 导致的连接问题,最后用 caching_sha2_password 插件解决的。

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

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个小时……

作者: meathill

爱编程,爱旅游,爱吐槽。 今年的目标是完成并运营至少一个 Side Project。 《Electron + Vue 实战开发》龟速创作中……

欢迎吐槽,请勿装死

This site uses Akismet to reduce spam. Learn how your comment data is processed.