PostgreSQL--杀死已挂掉的连接
发表于:2025-11-09 作者:千家信息网编辑
千家信息网最后更新 2025年11月09日,一、原理在数据库PostgreSQL中,一个客户端到服务器连接实际上是一个tcp socket连接,tcp连接是虚连接,一方非正常退出(如断电),另一方会继续维持这个连接。举个例子:一个客户端电脑正常
千家信息网最后更新 2025年11月09日PostgreSQL--杀死已挂掉的连接
一、原理
在数据库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;-- 突然断电,这种可能很小,但肯定存在。。。commit1.1、取消正在执行的sql pid (不会释放连接,只会取消sql查询语句)
SELECT pg_cancel_backend('26945'); #26945 是procpid1.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
服务器
服务
客户
侦探
客户端
小时
正在
一方
三个
参数
实际
状态
电脑
空闲
端的
系统
语句
主动
操作系统
不够
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
网络安全需要数学分析
新型网络安全架构
第五人格怎么连接不到服务器
软件开发培训学校村
软件开发的实习内容怎么写
中国移动网关连接虚拟服务器
什么是网络技术其主要功能
海洋空间数据库管理系统开发
如何管理好大型我的世界服务器
海康威视网络视频服务器怎么安装
抖音多开软件开发
app网站共用数据库
app软件开发怎么分工
管理软件开发中心
智能家居软件开发教程
大型软件开发举例
浙江立体化软件开发模型
计算机网络安全防治
网络安全创新展台
软件开发技术实施能力
mpp数据库的运维
北京叮咚互联网络科技有限公司
江苏省网络安全重点企业
数据库要求字符数范围
数据库安全性与完整性
网络安全科普知识讲座中学生
电子证照数据库采购
数据库技术面临挑战
奇虎360网络安全业务
服务器规格说明书