1
2
3
4
5
6
7
8
9
10
➜  sudo systemctl status postgresql
● postgresql.service - PostgreSQL RDBMS
Loaded: loaded (/lib/systemd/system/postgresql.service; enabled; vendor preset: enabled)
Active: active (exited) since Thu 2026-01-01 09:07:57 CST; 21s ago
Process: 726035 ExecStart=/bin/true (code=exited, status=0/SUCCESS)
Main PID: 726035 (code=exited, status=0/SUCCESS)
CPU: 862us
1月 01 09:07:57 debian-cab systemd[1]: Starting PostgreSQL RDBMS...
1月 01 09:07:57 debian-cab systemd[1]: Finished PostgreSQL RDBMS.

一、核心问题定位(关键)

从你提供的systemctl status输出能直接判定核心故障:

✅ PostgreSQL 主服务是「伪启动」状态Active: active (exited) + 执行命令是/bin/true,说明这个postgresql.service只是空壳服务,仅做状态标识,并未真正启动数据库进程。
✅ 这是 Debian/Ubuntu 系 PG 的专属特性:系统默认的postgresql.service总入口,不会实际启动进程,真正的数据库进程由「版本 + 端口」的子服务管理(例:postgresql@14-main.service)。
✅ 无端口、无法连接的根源:子服务未启动,主服务空跑,自然没有进程监听端口。

二、分步排查 & 解决(直接落地,按顺序执行)

步骤 1:查看 PG 真实子服务状态(必执行)

Debian 中 PG 会为每个安装版本创建独立子服务,执行命令查看所有 PG 相关服务的真实运行状态:

1
sudo systemctl list-units --type=service | grep postgresql

正常输出示例(子服务已启动):

1
2
postgresql@14-main.service   loaded active running   PostgreSQL Cluster 14-main
postgresql.service loaded active exited PostgreSQL RDBMS

我的输出内容为:

1
2
3
4
5
6

sudo systemctl list-units --type=service | grep postgresql
postgresql.service loaded active exited PostgreSQL RDBMS
● postgresql@16-main.service loaded failed failed PostgreSQL Cluster 16-main
● postgresql@17-main.service loaded failed failed PostgreSQL Cluster 17-main
postgresql@18-main.service loaded active running PostgreSQL Cluster 18-main

可以看出系统安装了 3 个 PG 版本(16/17/18),其中 16、17 版本子服务启动失败(failed),仅 18 版本正常运行;
✅ 大概率是 端口冲突:PG 默认监听 5432 端口,多版本共存时未做端口区分,16/17 抢占端口导致启动失败,18 虽启动但可能未配置对外监听;
✅ 你此前查询端口时未指定版本,系统默认识别 5432 端口(被故障版本占用),因此netstat查不到有效监听。

步骤 1:优先关停故障版本,释放端口资源(关键前置)

先停止启动失败的 16、17 版本,避免端口抢占干扰正常版本运行,执行命令:

1
2
3
# 关停16/17版本并禁用开机自启(彻底释放资源)
sudo systemctl stop postgresql@16-main.service postgresql@17-main.service
sudo systemctl disable postgresql@16-main.service postgresql@17-main.service

步骤 2:验证正常版本(18)运行状态 + 端口监听

① 查看 18 版本详细运行状态(确认无报错)

1
sudo systemctl status postgresql@18-main.service

✅ 合格标准:显示 Active: active (running),无红色报错日志。

② 精准查询 18 版本真实监听端口(必查!)

多版本 PG 共存时,版本会自动分配不同端口(默认规则:16→5433、17→5434、18→5432,也可自定义),执行命令查询实际监听端口

1
2
3
4
# 方式1(推荐,精准匹配postgres进程)
sudo ss -tulpn | grep postgres
# 方式2(备用,查询所有监听端口)
sudo netstat -tulpn | grep -E '5432|5433|5434'

✅ 正常输出示例(18 版本监听端口,比如 5432):

1
2
tcp   0  0 127.0.0.1:5432   0.0.0.0:*   LISTEN   xxx/postgres
tcp6 0 0 ::1:5432 :::* LISTEN xxx/postgres

步骤 2:启动真实的 PG 子服务

方式 1:启动指定版本子服务(推荐,精准)

1
2
3
4
# 启动子服务(关键命令)
sudo systemctl start postgresql@18-main.service
# 设置开机自启(避免重启失效)
sudo systemctl enable postgresql@18-main.service

方式 2:一键启动所有 PG 子服务(兜底)

若不确定版本,直接执行系统内置的 PG 专用启动命令,自动识别并启动所有集群:

1
sudo pg_ctlcluster all start

步骤 3:验证启动结果(确认故障修复)

执行以下 2 条命令,全部验证通过即为修复成功:

1. 验证子服务状态(显示active (running)

1
sudo systemctl status postgresql@18-main.service

✅ 合格输出:Active: active (running) since ...

2. 验证端口监听(能查到 5432 端口)

1
2
3
4
# 方式1:netstat查询(你的原查询方式)
sudo netstat -tulpn | grep 5432
# 方式2:ss查询(Debian更推荐,效率更高)
sudo ss -tulpn | grep postgres

✅ 合格输出(能看到 postgres 进程监听 5432 端口):

1
2
tcp  0  0 127.0.0.1:5432  0.0.0.0:*  LISTEN  xxx/postgres
tcp6 0 0 ::1:5432 :::* LISTEN xxx/postgres

三、额外连接异常兜底解决(端口正常后仍连不上补充)

若端口监听正常,但客户端 / 本地仍无法连接,大概率是PG 网络访问配置限制,只需修改 2 个核心配置文件:

配置 1:修改postgresql.conf(开启监听地址)

1
2
# 编辑配置文件(替换14为你的PG版本)
sudo vim /etc/postgresql/14/main/postgresql.conf

找到 listen_addresses 配置项,修改为:

1
2
# 允许本机+远程所有IP连接 | 仅本机连接则保留 localhost
listen_addresses = '*'

配置 2:修改pg_hba.conf(放行访问权限)

1
sudo vim /etc/postgresql/14/main/pg_hba.conf
1
2
3
4
5
6
# 方案1:允许所有IP访问(测试/内网环境,便捷)
host all all 0.0.0.0/0 scram-sha-256
# 方案2:仅局域网内访问(生产安全,推荐)
host all all 192.168.100.0/24 scram-sha-256
# 方案3:仅允许本机访问(生产安全,推荐)
host all all 127.0.0.1/32 scram-sha-256

配置修改后重启子服务生效

1
sudo systemctl restart postgresql@14-main.service

四、关键知识点总结(避免后续踩坑)

  1. Debian PG 服务特性postgresql.service 是「总开关」,仅做状态汇总,永远不会启动实际进程,必须操作 postgresql@版本-集群.service 子服务;
  2. 核心操作命令:启动 / 重启 / 停止 PG,优先用 systemctl 操作 postgresql@x-main.service,而非直接操作主服务;
  3. 端口默认值:PG 默认监听 5432,无端口 = 进程未启动,无需怀疑端口配置问题;
  4. 快捷排查命令pg_ctlcluster all status 可一键查看所有 PG 集群的运行状态,比 systemctl 更直观。

最终验证连接(本地测试)

执行以下命令,能正常进入 PG 终端即为全部正常:

1
sudo -u postgres psql

补充:快速查询 PG 版本(忘记版本号专用)

1
2
3
4
# 方式1
psql --version
# 方式2(查看安装的所有PG版本)
ls /etc/postgresql/