这两天又反复遇到这个问题,先写解决方案:
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个小时……
欢迎吐槽,共同进步