Skip to content

PostgreSQL 连接错误:socket "/tmp/.s.PGSQL.5432" 不存在

问题描述

当尝试使用 psql 连接 PostgreSQL 数据库时,出现以下错误:

psql: error: connection to server on socket "/tmp/.s.PGSQL.5432" failed: No such file or directory

这个错误通常表示 PostgreSQL 服务器没有正常运行,或者服务器没有在默认的 Unix 套接字路径上监听连接。

原因分析

这个问题可能有以下几种原因:

  1. PostgreSQL 服务未启动:服务可能由于异常关闭或配置问题而未能启动
  2. 残留的 PID 文件:上次异常关闭后遗留的 postmaster.pid 文件阻止了新实例启动
  3. 端口冲突:PostgreSQL 可能在非标准端口(如5433)上运行
  4. 磁盘空间不足:系统磁盘已满导致服务无法启动
  5. 多版本冲突:系统上安装了多个 PostgreSQL 版本导致配置混乱

解决方案

方案一:删除残留的 PID 文件并重启服务(最常见)

对于 macOS 系统(Intel 芯片):

bash
rm /usr/local/var/postgres/postmaster.pid
brew services restart postgresql

对于 macOS 系统(M1/M2/M3 芯片):

bash
rm /opt/homebrew/var/postgres/postmaster.pid
brew services restart postgresql

对于特定版本的 PostgreSQL(如版本15):

bash
rm /opt/homebrew/var/postgresql@15/postmaster.pid
brew services restart postgresql@15

WARNING

删除 postmaster.pid 文件前,请确保没有重要的 PostgreSQL 进程正在运行,否则可能导致数据损坏。

方案二:检查并终止残留的 PostgreSQL 进程

bash
# 检查是否有 PostgreSQL 进程在运行
pgrep -l postgres

# 如果有,终止所有 PostgreSQL 进程
sudo pkill -u postgres

# 再次检查确保所有进程已终止
pgrep -l postgres

方案三:检查服务状态和日志

bash
# 检查 PostgreSQL 服务状态
brew services list | grep postgres

# 查看日志文件以获取更多信息
tail -n 50 /usr/local/var/log/postgres.log
# 或
tail -n 50 /opt/homebrew/var/log/postgresql.log

方案四:检查磁盘空间

bash
# 检查磁盘使用情况
df -H

# 如果磁盘已满,清理一些空间后再尝试重启 PostgreSQL

方案五:重新安装 PostgreSQL

如果以上方法都无效,可以考虑重新安装:

bash
brew uninstall --force postgresql
brew install postgresql
brew services start postgresql

预防措施

  1. 正确关闭 PostgreSQL:总是使用 brew services stop postgresqlpg_ctl stop 命令停止服务
  2. 定期清理:定期检查磁盘空间和日志文件
  3. 避免强制终止:不要强制退出终端或应用程序当 PostgreSQL 正在运行

TIP

对于开发环境,可以考虑使用 Docker 运行 PostgreSQL,这样可以避免与系统自带的 PostgreSQL 发生冲突。

总结

PostgreSQL 连接错误 "No such file or directory" 通常是由于服务未正确启动或残留的 PID 文件导致的。通过删除残留的 PID 文件并重启服务,大多数情况下可以解决这个问题。如果问题仍然存在,检查服务日志和磁盘空间可以帮助找到根本原因。

记住定期维护你的 PostgreSQL 安装,并始终使用正确的方式启动和停止服务,可以避免这类问题的发生。