博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PostgreSQL--杀死已挂掉的连接
阅读量:6174 次
发布时间:2019-06-21

本文共 1181 字,大约阅读时间需要 3 分钟。

一、原理

在数据库PostgreSQL中,一个客户端到服务器连接实际上是一个tcp socket连接,tcp连接是虚连接,一方非正常退出(如断电),另一方会继续维持这个连接。

举个例子:一个客户端电脑正常连上服务器后,强行拔掉电源造成人为断电,重新启动电脑,再此连上服务器。用SQL语句select * from pg_stat_activily 查看服务器的所有连接,会发现本客户端的连接除了本次外,断电前的连接还在。因为服务器根本不知道客户端的断电行为,还以为那连接正在空闲状态。然而这个死连接不会永远存在,2个小时后,服务器上的这个连接会自动切掉,因为PostgreSQL支持TCP_KEEPLIVE机制。有三个系统变量tcp_keepalives_idle,tcp_keepalives_interval,tcp_keepalives_count 来设置PostgreSQL如何处理死连接。对于每个连接,PostgreSQL会对这个连接空闲tcp_keepalives_idle秒后,主动发送tcp_keeplive包给客户 端,以侦探客户端是否还活着 ,当发送tcp_keepalives_count个侦探包,每个侦探包在tcp_keepalives_interval 秒内没有回应,PostgreSQL就认为这个连接是死的,于是切断这个死连接。

在PostgreSQL, 这三个参数都设为0将使用操作系统的默认值,在linux下,tcp_keepalives_idle一般是2个小时,也就是2个小时后,服务器才可以自动关掉死连接。在实际应运中,可以自行调整以上参数。

然而,单单依靠服务器以此方法来切掉死连接,是永远不够。假设有一个连接,在运行以下交互式命令中突然断电

begin transaction;lock table xxx in exclusive mode;-- 突然断电,这种可能很小,但肯定存在。。。commit

1.1、取消正在执行的sql pid (不会释放连接,只会取消sql查询语句)

SELECT pg_cancel_backend('26945');  #26945  是procpid

1.2、释放杀死正在执行的sql,同时释放连接

select pg_terminate_backend(procpid)

1.3、批量释放杀死idle状态的连接

SELECT pg_terminate_backend(procpid) FROM pg_stat_activity WHERE current_query='
'

1.4、使用PG自带的pg_ctl工具杀死进程

pg_ctl kill TERM 4004

转载于:https://blog.51cto.com/13126942/2047679

你可能感兴趣的文章
网络攻击
查看>>
sorting, two pointers(cf div.3 1113)
查看>>
Scala并发编程【消息机制】
查看>>
win10下安装Oracle 11g 32位客户端遇到INS-13001环境不满足最低要求
查看>>
AngularJS-01.AngularJS,Module,Controller,scope
查看>>
【MySQL 安装过程1】顺利安装MySQL完整过程
查看>>
Inno Setup入门(二十)——Inno Setup类参考(6)
查看>>
图片自适应
查看>>
amd cmd
查看>>
Linux下的uml画图工具
查看>>
xml返回数组数据
查看>>
约瑟夫问题总结
查看>>
spring mybatis 批量插入返回主键
查看>>
指针函数小用
查看>>
开源力量公开课第二十三期-从SVN到Git,次时代代码管理
查看>>
输入挂
查看>>
升级迁移前,存储过程统计各个用户下表的数据量,和迁移后的比对
查看>>
sql注入分类
查看>>
初识CSS选择器版本4
查看>>
[Hadoop in China 2011] 朱会灿:探析腾讯Typhoon云计算平台
查看>>