laravel部署后mysql连接失败需三层排查:先验证服务状态(netstat/lsof+mysql直连),再确认.env配置生效(清缓存、tinker核对、db_host按环境填容器名或127.0.0.1、密码特殊字符加双引号),最后处理mysql 8+认证兼容问题(alter user切回mysql_native_password或升级php)。

部署 Laravel 项目后页面报 SQLSTATE[HY000] [2002] Connection refused 或 Access denied,说明 PHP 进程根本没触达 MySQL 服务,不是代码写错,而是连接链路在底层就断了——必须从服务状态、网络路径、认证机制三层逐级排查。
确认 MySQL 服务真实运行状态
别信界面图标或“我以为它开着”,直接用系统命令验证:
Windows 执行:netstat -ano | findstr :3306,若无输出,MySQL 没监听端口;macOS/Linux 执行:sudo lsof -i :3306,看是否有 mysqld 进程绑定。
再试一次直连:终端输入 mysql -h 127.0.0.1 -P 3306 -u root -p,敲回车后输密码(XAMPP/MAMP 默认空,Laragon 默认空或 root)。【如果这一步就报 Can't connect】,说明服务压根没起来,重启 MySQL 服务(Laragon 右键托盘图标 → Restart MySQL;Docker 执行 docker-compose up -d db)。
检查 .env 中的连接参数是否生效
这是最常被跳过的致命环节:改完 .env 后不清理缓存,Laravel 仍用旧配置跑。
第一步:执行 php artisan config:clear 清除内存缓存;
第二步:进入 tinker 验证真实值:php artisan tinker → 输入 env('DB_HOST') 和 config('database.connections.mysql.host'),两个返回值必须完全一致;
第三步:重点核对 DB_HOST 值——【Docker 环境必须写容器名(如 db),不能写 localhost 或 127.0.0.1;Laragon/XAMPP 必须写 127.0.0.1,不能写 localhost】;
第四步:DB_PASSWORD 若含 @ / : ? 等字符,必须用双引号包裹,例如 DB_PASSWORD="p@ss/w0rd",否则 DSN 解析会截断。
处理 MySQL 8+ 的 caching_sha2_password 认证问题
现象是连接卡住几秒后报 SQLSTATE[HY000] [2054] The server requested authentication method unknown to the client,且 phpinfo() 显示 mysqlnd 版本低于 7.4——这是 MySQL 8 默认插件与老版 PHP 扩展不兼容。
方法一(推荐,临时修复):进 MySQL 执行:
ALTER USER 'your_user'@'%' IDENTIFIED WITH mysql_native_password BY 'your_password';
FLUSH PRIVILEGES;
方法二(长期方案):升级 PHP 至 7.4+,并确认 php -i | grep mysqlnd 输出中包含 caching_sha2_password 或 sha256_password 字样。
注意:不要去改 my.cnf 的 default_authentication_plugin——这会影响所有新用户,而你只需修复现有 Laravel 用户的认证方式。
验证 PDO 驱动和数据库可达性
先确认 PHP 能调用 MySQL 驱动:
执行 php -r "var_dump(PDO::getAvailableDrivers());",输出数组里必须有 mysql;没有则需安装 php-mysql 扩展(Ubuntu:sudo apt-get install php-mysql;macOS:brew install php@8.3 并启用 pdo_mysql.so)。
再绕过 Laravel 直连测试:
在 tinker 中执行 DB::connection()->getPdo();,成功返回一个 PDO 实例即表示通路已打通;若报错,错误信息就是最终病因,不用再往下查。











