Skip to main content
 首页 » 数据库

监控 PostgreSQL 数据库连接

2022年07月19日178insus

本文讨论PostgreSQL 数据库连接。首先回顾下数据库连接可能的状态,如何检查连接状况、终止空闲连接释放占用资源。

1. 概述

要修改或读取数据库,首先要创建数据库连接。但每个连接需要占用资源(包括进程和内存空间),系统资源是有限的仅能支撑一定数量的连接。一旦超过限制则会抛出异常或拒绝连接。PostgreSQL 在配置文件postgresql.conf可以通过参数进行有效限制。

下面我们看看PostgreSQL已建立连接的几种状态。如何发现连接正在运行或已经空闲了一段时间,对于空闲的连接应该终止并回收资源。

2. 连接状态

一旦创建了PostgreSQL连接,它能执行不同的操作并导致状态改变。基于状态和连接当前状态持续的时间决定连接状态是活动、空闲状态、遗弃。需要提醒的是,如果应用连接没有显示关闭连接,连接会保持有效,即使客户端已经断开连接的情况下也占用资源。

一般有四种连接状态:

活动:表示连接正在工作。
空闲:表示连接处于空闲状态,我们需要基于已空闲时间跟踪这些连接状态。
事务内空闲:这表示后端在事务中,但它目前没有做任何事情,可能正在等待最终用户的输入。
事务内空闲(终止):这种状态与事务内空闲类似,只是事务中某条语句导致错误。还需要根据闲置时间对其进行监控。

3. 管理连接状态

3.1 标识连接状态和持续时间

PostgreSQL提供pg_stat_activity 视图,可以获得连接的相关信息。如果执行下面语句可以返回相应信息:

SELECT pid, usename, backend_start,state,query, backend_type 
from pg_stat_activity; 

在这里插入图片描述

从上面输出可以看到state字段,可以根据该字段进一步过滤特定状态连接。如可以仅查询空闲的连接:

SELECT pid, usename, backend_start,state,query, backend_type 
from pg_stat_activity 
where state='idle'; 

3.2 查询不需要的连接

我们可以对查询进行更多的修改,以缩小寻找的信息范围,以便有针对性操作特定连接。我们可以查询仅为空闲的pid。我们还需要监控连接空闲后的时间,以检查是否有必要丢弃连接,释放资源。实例查询如下:

SELECT 
	pid, 
	usename, 
	application_name, 
	backend_start, 
	state_change, 
	STATE 
FROM 
	pg_stat_activity 
WHERE 
	STATE = 'idle'; 

3.3 必要时终止连接

一旦我们找到了处于挂起状态或长时间空闲的连接,我们可以使用下面这个查询来终止后端进程,而不影响服务器的操作:

SELECT pg_terminate_backend(PID); 

4. 总结

本文介绍了PostgreSQL连接状态,如何查询不同状态的连接,终止挂起或空闲连接以释放资源。


本文参考链接:https://blog.csdn.net/neweastsun/article/details/111768850
阅读延展