macOS重启后无法连接PostgreSQL 提示5432套接字文件不存在
macOS Monterey 12.2 重启后Homebrew版PostgreSQL本地连接失败修复
问题复现
- 运行环境:macOS Monterey 12.2,通过Homebrew部署PostgreSQL
- 执行服务重启命令后终端提示启停成功,但连接数据库时报套接字不存在:
(base) user@user Application Support % brew services restart postgresql Stopping `postgresql`... (might take a while) ==> Successfully stopped `postgresql` (label: homebrew.mxcl.postgresql) ==> Successfully started `postgresql` (label: homebrew.mxcl.postgresql) (base) user@user Application Support % psql postgres psql: error: connection to server on socket "/tmp/.s.PGSQL.5432" failed: No such file or directory Is the server running locally and accepting connections on that socket?
- 按网上教程排查残留
postmaster.pid文件时,默认数据路径/usr/local/var/postgres/下找不到该文件,仅在/usr/local/var/postgres.backup/路径下存在对应文件,删除后报错无变化。
目录异常原因说明
postmaster.pid是PostgreSQL启动时在当前生效的数据目录下生成的进程锁文件,用来避免多进程同时操作同一份数据造成损坏,服务正常关闭时会自动删除,不会残留。
出现默认路径无pid、备份路径有pid的情况,核心原因是Homebrew记录的PostgreSQL数据目录配置和实际数据存放路径不匹配:
/usr/local/var/postgres.backup/下的pid文件是历史残留:大概率是之前做PostgreSQL版本升级、手动备份数据、或者误操作把原数据目录重命名为backup后缀时,当时运行的数据库进程留下的锁文件,当前服务启动根本没有加载这个目录,删除这个文件对修复问题没有任何作用。/usr/local/var/postgres/下没有pid文件,是因为服务启动时要么指向了空的错误目录,要么目录权限不对,数据库进程启动后直接崩溃退出,根本没走到生成pid和套接字文件的步骤,所以brew的提示仅代表系统后台任务加载成功,不代表PostgreSQL数据库服务真的正常运行了。
修复步骤
- 先确认真实进程状态,不要依赖brew的启停提示:
执行ps aux | grep postgres,如果输出中没有带postgres -D参数的运行进程,就说明数据库实际启动失败。 - 定位有效数据目录:
执行brew info postgresql查看输出中默认标注的数据目录,核对/usr/local/var/postgres/路径下是否存在PG_VERSION、base文件夹、pg_hba.conf这类PostgreSQL核心文件。如果该路径为空、或缺少核心文件,就说明完整数据实际存放在postgres.backup目录下。 - 修正数据目录配置:
先执行brew services stop postgresql停掉后台任务,再把备份目录重命名回标准路径:
修正目录权限,避免权限不足导致启动失败:mv /usr/local/var/postgres.backup /usr/local/var/postgressudo chown -R $(whoami) /usr/local/var/postgres - 清理残留文件后重启服务:
删掉数据目录下残留的旧锁文件:
重新启动PostgreSQL服务:rm -f /usr/local/var/postgres/postmaster.pidbrew services start postgresql - 连接验证:
等待3-5秒让服务完成初始化,执行ls /tmp/.s.PGSQL.5432确认套接字文件已生成,再运行psql postgres即可正常连接。
如果完成上述操作后仍启动失败,直接查看PostgreSQL运行日志定位具体错误:
cat /usr/local/var/log/postgres.log。最常见的报错原因是跨大版本升级PostgreSQL后未做数据格式迁移,这种情况执行brew postgresql-upgrade-database完成数据升级适配即可。
内容的提问来源于stack exchange,提问作者pd441
相关产品推荐
相关产品推荐

