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 sudo systemctl stop postgresql@16-main.service postgresql@17-main.servicesudo 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 sudo ss -tulpn | grep postgressudo 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.servicesudo 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 sudo netstat -tulpn | grep 5432sudo 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 sudo vim /etc/postgresql/14/main/postgresql.conf
找到 listen_addresses 配置项,修改为:
配置 2:修改pg_hba.conf(放行访问权限) 1 sudo vim /etc/postgresql/14/main/pg_hba.conf
1 2 3 4 5 6 host all all 0.0.0.0/0 scram-sha-256 host all all 192.168.100.0/24 scram-sha-256 host all all 127.0.0.1/32 scram-sha-256
配置修改后重启子服务生效 1 sudo systemctl restart postgresql@14-main.service
四、关键知识点总结(避免后续踩坑) Debian PG 服务特性 :postgresql.service 是「总开关」,仅做状态汇总,永远不会启动实际进程 ,必须操作 postgresql@版本-集群.service 子服务;核心操作命令 :启动 / 重启 / 停止 PG,优先用 systemctl 操作 postgresql@x-main.service,而非直接操作主服务;端口默认值 :PG 默认监听 5432,无端口 = 进程未启动,无需怀疑端口配置问题;快捷排查命令 :pg_ctlcluster all status 可一键查看所有 PG 集群的运行状态,比 systemctl 更直观。最终验证连接(本地测试) 执行以下命令,能正常进入 PG 终端即为全部正常:
补充:快速查询 PG 版本(忘记版本号专用) 1 2 3 4 psql --version ls /etc/postgresql/