Laravel 5.2 + RDS MySQL 8.0 连接报错SQLSTATE[HY000] [2002]求助
解决Laravel 5.2 + PHP 5.6连接RDS MySQL 8.0的SQLSTATE[HY000] [2002]错误
针对你遇到的情况,以下是旧版Laravel+AWS RDS环境下升级MySQL 8.0后常见的排查和解决步骤:
1. 验证EC2到RDS的基础连通性
先排除网络层面的问题:
- 在EC2实例上执行命令行连接测试:
如果命令行也连不上,检查:mysql -h <你的RDS端点> -u <数据库用户名> -p- RDS安全组是否允许EC2实例的私有IP访问3306端口(虽然之前5.7正常,但升级后参数组或安全组可能被误改)
- RDS实例的状态是否为「可用」,有没有重启后未完全就绪的情况
如果命令行能连上,但Laravel不行,问题出在PHP扩展或Laravel配置上。
2. 升级PHP的MySQL扩展
PHP 5.6默认的mysqlnd/mysqli版本可能不兼容MySQL 8.0,即使使用mysql_native_password认证也会出现连接失败:
- 在AWS Linux 1(Amazon Linux AMI)上,执行以下命令更新扩展:
安装完成后重启Web服务:sudo yum update php-mysqlnd# Apache环境 sudo service httpd restart # PHP-FPM环境 sudo service php-fpm restart
3. 调整Laravel数据库配置的SSL参数
MySQL 8.0默认强制要求SSL连接(部分RDS参数组默认开启require_secure_transport),而Laravel 5.2的默认配置未启用SSL:
- 在
config/database.php的mysql配置数组中添加SSL相关选项:'mysql' => [ 'driver' => 'mysql', 'host' => env('DB_HOST', 'localhost'), 'database' => env('DB_DATABASE', 'forge'), 'username' => env('DB_USERNAME', 'forge'), 'password' => env('DB_PASSWORD', ''), 'charset' => 'utf8mb4', 'collation' => 'utf8mb4_unicode_ci', 'prefix' => '', 'strict' => false, 'engine' => null, // 添加SSL配置 'options' => [ PDO::MYSQL_ATTR_SSL_CA => '/etc/pki/tls/certs/rds-ca-2019-root.pem', ], ], - 先在EC2上下载RDS的CA证书:
sudo wget -O /etc/pki/tls/certs/rds-ca-2019-root.pem https://s3.amazonaws.com/rds-downloads/rds-ca-2019-root.pem
4. 检查PHP的open_basedir限制
如果EC2的PHP配置中启用了open_basedir,需要确保证书文件路径在允许访问的目录范围内:
- 编辑PHP配置文件(如
/etc/php.ini),找到open_basedir行,添加证书所在目录:
重启Web服务生效。open_basedir = /var/www/html:/tmp:/etc/pki/tls/certs
5. 确认RDS参数组的关键设置
除了认证插件,检查以下参数:
default_authentication_plugin:确保设置为mysql_native_passwordrequire_secure_transport:如果之前手动关闭过,确认升级后是否被重置为ON(若暂时关闭此参数,可跳过SSL配置测试连接)
内容的提问来源于stack exchange,提问作者Lloyd Banks
相关产品推荐
相关产品推荐

