PostgreSQL--杀死已挂掉的连接
发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,一、原理在数据库PostgreSQL中,一个客户端到服务器连接实际上是一个tcp socket连接,tcp连接是虚连接,一方非正常退出(如断电),另一方会继续维持这个连接。举个例子:一个客户端电脑正常
千家信息网最后更新 2026年11月01日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安全错误
数据库的锁怎样保障安全
互联网黑科技
互联网金融 科技
科技服务与互联网
宜安科技 互联网金融
互联网科技公司有哪些
互联网科技美容
华脉科技工业互联网产品
科技赋能互联网健康
广州恒生互联网科技有限
宜昌元轩互联网科技有限公司
互联网科技研发水平
本届互联网博览会上的黑科技
山东星卡互联网科技有限公司官网
上海钢联属于互联网科技股吗
智帮互联网科技公司最近动向
互联网营销推广黑科技
神州科技互联网有限公司
江苏互联网智能科技产品出厂价
互联网科技博主张洲
科技美学互联网 艺术
西安纸贵互联网科技有限公司
为想互联网科技怎么样
互联网科技工作委员会副主任毛军
互联网科技工作委员会毛军
汇久创客互联网科技
天扬科技互联网广告
佩信高科技互联网
央行互联网金融科技公司
互联网科技大赛获奖感言
陕西云淼互联网科技公司