Postgresql启动无监听端口问题的解决

问题

在初始化msfdb时,报错postgresql无法连接。具体错误如下:

msf > msfdb init

\* exec: msfdb init

i Database already started

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

Is the server running locally and accepting connections on that socket?

尝试

根据报错信息,做了如下尝试:

  1. 查看/var/run/postgresql/目录中有没有.s.PGSQL.5432文件,确实没有,查看权限是postgres的读写执行都有,排除权限问题。
  2. 查看配置文件/etc/postgresql/18/main/postgresql.conf,listen_address取消注释,也是不行,排除配置文件问题,因为默认这个配置文件从未改过。
  3. 使用sudo -u postgres service postgresql restart由postgres服务账号重启服务,也是不行,排除服务账号的问题。
  4. 查看配置文件中socket的路径确实是/var/run/postgresql/,排除socket默认路径问题。

根本原因

不断地尝试service stop,start,都是显示服务activate已启动,但ss -tuln查看仍然没有5432的监听端口。ps aux | grep postgres 也没发现进程。说明问题出在这里。

存在一个集群环境,且状态为down,没有启动。由于没有存活的集群,自然就不会有 postgres 进程监听 5432 端口,也就不会有 Unix socket 文件。

而service postgresql start 的职责是"按配置尝试启动所有已创建的数据库集群",即使某个集群启动失败,服务状态也可能显示为 active (exited),因为启动脚本本身执行完成了。相当于PostgreSQL 的"服务壳"启动成功,但数据库实例(集群)并未真正运行。

一句话总结:PostgreSQL 的总控服务显示启动成功,但底层的数据库实例没有运行,导致端口和 socket 缺失,因而 msfdb 无法连接。

解决

手动使用 pg_ctlcluster 启动集群后,PostgreSQL 真正开始工作,问题解决。

查看集群,正常。

查看进程和监听端口,正常。

查看socket文件,已创建。

查看具体的数据库实例,运行中。

让我们不断学习,保持好奇和兴趣!

Iain

相关推荐
倒流时光三十年4 小时前
PostgreSQL NULLIF 条件表达式函数详解
数据库·sql·postgresql
倒流时光三十年7 小时前
PostgreSQL VALUES 列表详解
数据库·postgresql
倒流时光三十年7 小时前
PostgreSQL GREATEST 条件表达式函数详解
服务器·数据库·postgresql
agilearchitect2 天前
asyncpg:专为 asyncio 打造的 PostgreSQL 驱动
数据库·其他·postgresql
IvorySQL2 天前
PostgreSQL 技术日报 (6月10日)|多工具版本更新,PG19 图语法落地
数据库·postgresql
IvorySQL2 天前
PostgreSQL 全球对话:开源链接世界,共建共治共享
数据库·postgresql·开源
IvorySQL2 天前
PostgreSQL 技术日报 (6月11日)|规划器扩展优化,POSETTE 大会倒计时
数据库·postgresql
dabidai2 天前
Docker PostgreSQL Windows 权限问题总结
windows·docker·postgresql
biubiubiu07062 天前
Ubuntu中3种定时任务
数据库·ubuntu·postgresql