PostgreSQL 运行状态排查方法整理
在运维或排查 PostgreSQL 数据库问题时,通常需要从进程层面 、网络层面 和 应用层面 进行综合判断。以下是三种常用方法的详细说明。
方法一:使用 ps 查看 PostgreSQL 进程树
命令
bash
ps -axjf | grep postgres
命令拆解
| 组件 | 作用 | 详细解释 |
|---|---|---|
ps |
Process Status(进程状态) | 列出系统中正在运行的进程。 |
-a |
All(全部) | 显示所有用户的所有进程(不包括会话领头进程)。 |
-x |
eXtra(额外) | 包含没有控制终端(TTY)的进程,常用于显示守护进程。 |
-j |
Job(作业) | 显示作业控制信息(如进程组 ID)。 |
-f |
Full(完整) | 以完整格式显示进程信息,包含命令行参数。 |
| ` | ` | 管道 |
grep postgres |
过滤 | 筛选出包含 "postgres" 关键字的行。 |
为什么使用 -axjf ?
- 显示完整命令行参数 :可看到子进程如何被主进程 fork 出来(如
-c config_file=...)。 - 展示父子关系 :输出包含
PPID或树形结构,便于确认进程归属。 - 涵盖所有进程:包括无终端关联的后台守护进程,符合 PostgreSQL 的运行特征。
典型输出示例
bash
$ ps -axjf | grep postgres
1000 0 0 0 0 0 1000 1 0 0 - 0 0 0.0 0.0 0:00.01 ? 0:00 {postgres} /usr/lib/postgresql/15/bin/postgres -D /var/lib/postgresql/15/main -c config_file=/etc/postgresql/15/main/postgresql.conf
1000 0 0 0 0 0 1000 2 0 0 - 0 0 0.0 0.0 0:00.02 ? 0:00 \_ postgres: checkpointer process
1000 0 0 0 0 0 1000 3 0 0 - 0 0 0.0 0.0 0:00.01 ? 0:00 \_ postgres: writer process
1000 0 0 0 0 0 1000 4 0 0 - 0 0 0.0 0.0 0:00.00 ? 0:00 \_ postgres: wal writer process
1000 0 0 0 0 0 1000 5 0 0 - 0 0 0.0 0.0 0:00.00 ? 0:00 \_ postgres: autovacuum launcher process
1000 0 0 0 0 0 1000 6 0 0 - 0 0 0.0 0.0 0:00.00 ? 0:00 \_ postgres: stats collector process
1000 0 0 0 0 0 1000 7 0 0 - 0 0 0.0 0.0 0:00.00 ? 0:00 \_ postgres: logical replication launcher process
注意事项
- 过滤局限性 :
grep postgres可能匹配到grep自身。建议使用:
bash
ps -axjf | grep -w postgres
- 查看特定进程详情:
bash
ps -p 1000 -o pid,ppid,cmd,%cpu,%mem
小结
该命令是 DBA 排查 PostgreSQL 状态的常用手段,不仅能确认数据库是否运行,还能验证各后台进程(如 wal writer、autovacuum)是否正常启动,并归属同一实例。
方法二:使用 ss 查看端口监听情况
命令
bash
ss -tnlp | grep ':5432'
注:若 PostgreSQL 使用非默认端口(如 5555),请替换为实际端口号。
命令拆解
| 组件 | 含义 | 说明 |
|---|---|---|
| ss | Socket Statistics | 查看网络连接的现代工具,比 netstat 更快。 |
-t |
TCP | 仅显示 TCP 连接。 |
-n |
Numeric | 直接显示 IP 和端口号(不解析域名)。 |
-l |
Listening | 仅显示监听状态的套接字。 |
-p |
Process | 显示监听该端口的进程(PID/程序名)。 |
grep ':5432' |
过滤 | 保留包含 :5432 的行。 |
预期输出示例
bash
tcp LISTEN 0 128 0.0.0.0:5432 0.0.0.0:* users:(("postgres",pid=1234,fd=6))
tcp:协议类型。LISTEN:端口处于监听状态。0.0.0.0:5432:监听所有接口的 5432 端口。users:(("postgres",pid=1234,fd=6)):- 进程名:
postgres - PID:
1234 - fd:文件描述符(内部标识)
- 进程名:
适用场景
- 快速验证 PostgreSQL 是否在监听预期端口。
- 定位占用端口的具体进程。
方法三:使用 pg_ctl 检查 PostgreSQL 实例状态(官方方式)
命令
bash
sudo -u postgres /usr/local/pgsql/bin/pg_ctl -D /pgccc/pgdata status
路径
/usr/local/pgsql/bin/pg_ctl和数据目录/pgccc/pgdata需根据实际安装路径调整。
命令拆解
| 组件 | 含义 | 说明 |
|---|---|---|
sudo -u postgres |
切换用户 | PostgreSQL 应由专用 postgres 用户运行。 |
/usr/local/pgsql/bin/pg_ctl |
控制工具 | PostgreSQL 官方提供的管理工具。 |
-D /pgccc/pgdata |
数据目录 | 指定 PostgreSQL 实例的数据存储路径。 |
status |
操作指令 | 查询实例当前运行状态。 |
预期输出
- 运行中:
bash
pg_ctl: server is running (PID: 5678)
- 未运行:
bash
pg_ctl: no server running
优势与局限
- ✅ 最准确:直接反映 PostgreSQL 内部状态。
- ❌ 依赖路径 :必须知道正确的
pg_ctl路径和数据目录。 - ❌ 极端情况 :若进程崩溃但端口仍被占用,需结合
ss判断。
方法对比与推荐排查顺序
| 方法 | 适用层面 | 优点 | 局限 |
|---|---|---|---|
ss |
网络层 | 快速验证端口是否开放,直接关联 PID | 无法判断服务内部是否健康 |
pg_ctl status |
应用层 | 官方工具,结果权威可靠 | 需知道数据目录路径 |
ps -axjf |
进程层 | 展示完整进程树,验证子进程状态 | 无法直接确认端口或服务逻辑状态 |
推荐排查流程
- 先用
ss:确认5432端口是否被监听。 - 再用
pg_ctl status:确认PostgreSQL实例是否真正运行。 - 辅以
ps -axjf:深入分析进程结构,排查异常子进程。
三者结合,可全面覆盖 "端口 → 进程 → 服务状态" 的排查链路。