PDOException::("PDO::__construct(): 使用 MySQL 8 / PHP 7.2 / Laravel 进行缓存_sha2 auth: 109 时出现意外的服务
Posted
技术标签:
【中文标题】PDOException::("PDO::__construct(): 使用 MySQL 8 / PHP 7.2 / Laravel 进行缓存_sha2 auth: 109 时出现意外的服务器响应")【英文标题】:PDOException::("PDO::__construct(): Unexpected server respose while doing caching_sha2 auth: 109") with MySQL 8 / PHP 7.2 / Laravel 【发布时间】:2019-01-21 12:28:34 【问题描述】:我刚刚安装了我的开发环境。
当我尝试通过 SequelPro 连接 mysql db 时,我得到:
Authentication plugin 'caching_sha2_password' cannot be loaded
如:Authentication plugin 'caching_sha2_password' cannot be loaded 中所述,我跑了:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '';
然后我可以通过 SequelPro 连接我的数据库
但是当我执行 Laravel 命令时:
php artisan migrate
我明白了:
PDOException::("PDO::__construct(): Unexpected server respose while doing caching_sha2 auth: 109")
我现在该怎么办?
PD:我在 Mac 上使用 Laravel Valet 和 Laravel 5.6。
【问题讨论】:
我也有同样的问题。 :/ 你修好了吗? 是的。将mysql降级到以前的版本 我通过在my.cnf
中设置默认身份验证方法mysql_native_password
来修复它
【参考方案1】:
您必须通过 shell 使用 mysql 命令更改 laravel 应用程序中的使用
ALTER USER 'user'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'your password';
ALTER USER 'user'@'%' IDENTIFIED WITH caching_sha2_password BY 'your password';
【讨论】:
【参考方案2】:这个问题有利于安全,mybe。
但是我用命令解决了问题:
-
ALTER USER
root
@localhost
IDENTIFIED WITH caching_sha2_password BY 'password';
重启mysql
立即尝试
希望您不会再看到此错误。
【讨论】:
【参考方案3】:使用$ mysql -uUser -pPa$$w0rd
后,可以使用mysqli_real_connect()
或 PDO 使用 PHP 打开 MySQL 连接
确保用户已激活缓存 sha2 密码,而不是本机密码。 (PHP 7.2.9-1,MySQL 8.0.12)
当更改为原生密码时 PHP 说
mysqli::real_connect(): 执行缓存_sha2 身份验证时出现意外的服务器响应:109
在缓存 sha2 密码处于活动状态时,我总是得到:
mysqli::real_connect(): (HY000/1045): 拒绝用户 'User'@'localhost' 访问(使用密码:YES)
所以尝试使用$ mysql
从Shell 登录,成功了,之后我就可以连接PHP。似乎是 PHP mysqlnd 中的一个错误。
在打开 MySQL 连接之前实施shell_exec('mysql -u'.$user.' -p"'.$password.'" -e quit > /dev/null 2>&1');
,现在解决了我的问题。
重启或重启MySQL服务,重置缓存密码,再次弹出拒绝访问信息。
希望这会有所帮助。
问候
【讨论】:
这确实是一个“快速而肮脏”的解决方案,它不适合更大的应用程序。可能会对此进行官方修复。以上是关于PDOException::("PDO::__construct(): 使用 MySQL 8 / PHP 7.2 / Laravel 进行缓存_sha2 auth: 109 时出现意外的服务的主要内容,如果未能解决你的问题,请参考以下文章
[单选题]PDO::ATTR_ERRMODE设置为以下哪个值时,PDO会抛出PDOException?
致命错误:未捕获的异常“PDOException”,带有消息“SQLSTATE [42000]:语法错误或访问冲突 PHP 和 PDO
PDO PHP - PDOException - 数值超出范围:1264 第 1 行的列“customer_id”的值超出范围