Laravel连接PostgreSQL执行migrate时出现SQLSTATE[08006]超时错误
针对你执行php artisan migrate时遇到的SQLSTATE[08006] [7] timeout expired错误,这个问题大多和网络连接限制、数据库配置有关,结合你使用的是AWS RDS实例,给你几个排查和解决的方向:
检查RDS安全组的网络访问权限
AWS RDS默认会通过安全组限制访问来源,你需要确保你的本地公网IP被添加到RDS实例的安全组入站规则中,允许5432端口的TCP连接。可以临时用0.0.0.0/0(不推荐生产环境)测试是否是IP限制导致的超时。
另外,你可以用命令测试端口连通性:nc -zv projects.cggts***.rds.amazonaws.com 5432如果返回成功提示,说明端口是通的;如果失败,那肯定是网络层面的问题。
调整Laravel数据库连接超时参数
默认的连接超时可能太短,尤其是连接远程RDS实例时。你可以在config/database.php的pgsql配置块中添加超时设置:'pgsql' => [ // 保留原有配置项 'timeout' => 30, // 单位:秒,可根据实际情况调整 ],修改后记得清除配置缓存:
php artisan config:clear验证数据库凭证和实例状态
先确认RDS实例处于可用状态(登录AWS RDS控制台查看),然后用PostgreSQL客户端工具(比如pgAdmin)直接用你.env里的账号密码连接RDS实例,尝试执行出错时的查询语句:select * from information_schema.tables where table_schema = public and table_name = migrations如果工具也连不上,那可能是凭证错误或者RDS实例本身的问题;如果能连上,再回到Laravel排查配置细节。
启用SSL连接(AWS RDS推荐)
AWS RDS PostgreSQL通常要求SSL连接,你可以在.env中添加:DB_SSLMODE=require然后在
config/database.php中把pgsql的sslmode配置改为:'sslmode' => env('DB_SSLMODE', 'require'),这可能解决因为SSL配置缺失导致的连接超时。
内容的提问来源于stack exchange,提问作者Francisco Sanchez

