在PostgreSQL中,检查数据库运行状态通常分为操作系统层面(检查进程、服务和端口)和数据库层面(检查内部连接、运行时间及活动状态)。
以下是常用的检查命令和语句:
一、 操作系统层面 (OS Level)
在服务器终端(通常是Linux)上执行以下命令,无需登录数据库:
1. 检查服务状态 (Systemd)
如果你的系统使用 systemd 管理 PostgreSQL 服务,这是最直观的检查方式:
Bash
systemctl status postgresql
# 或者指定具体版本,例如:
systemctl status postgresql-14
(如果状态显示为 active (running),则表示服务正在运行。)
2. 检查 PostgreSQL 进程
查看数据库的主进程(postmaster)和后台工作进程是否在运行:
Bash
ps -ef | grep postgres
(正常情况下,你会看到一个主进程 /usr/pgsql-xx/bin/postgres -D /var/lib/pgsql/xx/data,以及多个子进程如 logger, checkpointer, background writer 等。)
3. 检查端口监听状态
PostgreSQL 默认使用 5432 端口。检查该端口是否被正常监听:
Bash
ss -tulnp | grep 5432
# 或者使用 netstat
netstat -tulnp | grep 5432
4. 使用 pg_isready 工具
这是 PostgreSQL 自带的命令行工具,专门用于检查数据库服务器的连接状态:
Bash
pg_isready -h localhost -p 5432
(如果运行正常,会返回类似 localhost:5432 - accepting connections 的信息。)
二、 数据库层面 (Database Level)
使用 psql 登录到数据库后,可以执行以下 SQL 语句来深度检查数据库的运行健康状态:
1. 检查数据库启动时间
查看主服务进程的启动时间,可以借此判断数据库是否发生了意外重启:
SQL
SELECT pg_postmaster_start_time();
2. 检查当前会话与活动状态 (pg_stat_activity)
这是 DBA 最常用的视图,用于查看当前有多少连接,以及它们正在执行什么操作:
SQL
-- 查看当前所有连接的基本状态
SELECT
datname AS database_name,
usename AS user_name,
client_addr AS client_ip,
state,
query_start,
query
FROM pg_stat_activity
WHERE state IS NOT NULL;
状态 (state) 说明:
active: 正在执行查询。
idle: 空闲,等待客户端发送新命令。
idle in transaction: 处于事务中,但当前没有执行查询(需警惕长期处于此状态的连接,可能导致锁阻塞)。
3. 检查数据库是否处于只读/恢复模式 (主备集群检查)
如果你的数据库是主备架构,可以通过以下语句检查当前节点是主库还是备库:
SQL
SELECT pg_is_in_recovery();
(返回 f (false) 表示是主库(可读写),返回 t (true) 表示是备库(只读/恢复模式)。)
4. 简单连通性与版本检查
最简单的连通性测试,能返回结果说明数据库可以正常响应查询:
SQL
SELECT version();
|