本地Rails应用执行heroku local报PG::ConnectionBad连接错误求助
嘿,我碰到过好几次类似的问题,尤其是从Heroku拉数据到本地后容易出现PostgreSQL连接故障,给你几个实用的排查步骤:
先检查数据库配置文件
导入Heroku远程数据后,你的项目配置(比如Rails里的config/database.yml)大概率被修改了,或者配置项和本地PostgreSQL环境不匹配。打开这个文件,重点核对development环境的以下字段:host:本地默认是localhost或留空port:默认是5432,别和其他服务冲突database:要和你导入的备份数据库名一致username:通常是你的系统用户名,比如Mac下就是你登录的账号名
确认PostgreSQL真的在正常运行
虽然brew services restart postgresql显示启动成功,但咱们得手动验证进程状态:ps aux | grep postgres如果能看到好几条postgres相关的进程,说明服务没问题;如果没看到,试试手动指定数据目录启动:
# Intel Mac路径 pg_ctl -D /usr/local/var/postgres start # M1/M2 Mac路径 pg_ctl -D /opt/homebrew/var/postgres start查看PostgreSQL日志找根源
日志里藏着连接失败的具体原因,比如权限不足、数据库不存在、端口被占,直接看最新的日志内容:# Intel Mac tail -f /usr/local/var/postgres/server.log # M1/M2 Mac tail -f /opt/homebrew/var/postgres/server.log比如日志里如果出现“could not bind to address 127.0.0.1:5432”,那就是端口被其他程序占用了。
重新创建数据库并重新导入
有时候导入数据的过程中会出现数据库损坏,咱们干脆重建:- 先删掉本地出问题的数据库:
dropdb your_local_db_name - 新建一个干净的数据库:
createdb your_local_db_name - 重新从Heroku拉数据:
heroku pg:pull DATABASE_URL your_local_db_name --app your_heroku_app_name
- 先删掉本地出问题的数据库:
排查端口占用情况
要是日志显示端口被占,找出占用5432端口的进程并杀掉:lsof -i :5432找到对应的PID后,执行:
kill -9 <进程PID>然后再重启PostgreSQL服务。
关于你找不到postmaster.pid的问题:这个文件本来就只有PostgreSQL运行时才会出现在数据目录里(就是上面提到的/usr/local/var/postgres或/opt/homebrew/var/postgres),如果找不到,说明服务根本没启动起来,按照上面的步骤手动启动后再去看,应该就能找到了。
内容的提问来源于stack exchange,提问作者andrer0cha

