开发者社区> 云平_Stephen> 正文

PostgreSQL9.6+新增空闲事务自动查杀功能

简介: [TOC] 概述 PostgreSQL9.6 版本较之前版本新增了一个参数:idle_in_transaction_session_timeout ,该参数是为了自动查杀存在的空闲事物idle in transaction。
+关注继续查看

[TOC]

概述

PostgreSQL9.6 版本较之前版本新增了一个参数:idle_in_transaction_session_timeout ,该参数是为了自动查杀存在的空闲事物
idle in transaction。下面我们详细了解下这个参数

参数简介

PG在日常使用中会有 ‘idle in transaction’ 进程,引发这个进程的原因一般都是 代码中忘记关闭已开启的事物,或是系统中存在僵死的进程等。
‘idle in transaction’ 会阻止vacuum,造成数据膨胀,又有可能引起PG的事物ID wraparound的危险

为解决这个问题。9.6新增超时自动查杀空闲事物的功能
默认:idle_in_transaction_session_timeout = 20000
单位毫秒,也就是20秒就会自动查杀空闲事物

这个参数的设置,可以先仔细观察自己系统中是否经常存在空闲事物,要是存在的多,可以设置一下
如果自己的业务逻辑上,在事物开启后需要等待一些时间的话。需要考虑下这个超市设置多少合适,根据自己业务而定。
如果设置的过短,可能会对一些业务产生影响

简单测试

打开参数

该参数并不是默认开启,需要手动配置才能开启此功能。在postgresql.conf文件中找到添加 一行

idle_in_transaction_session_timeout = 20000 

修改此参数无需重启数据库,reload即可。应用连接也无需重连

pg_ctl reload 

设置之后在命令行可查看该参数设置

postgres=# show idle_in_transaction_session_timeout;
 idle_in_transaction_session_timeout 
-------------------------------------
 20s
(1 row)

即表示已经启用

测试事物

开启一个事物,创建一张表插入一条数据

postgres=# begin;
BEGIN

postgres=# create table test03(id int, name text);
CREATE TABLE

postgres=# insert into test03 values (1,'dasd');
INSERT 0 1

此时查看事物状态,可以看到 state 为 idle in transaction,此时就触发了上述参数控制的内容。若在超时时间内继续事物操作,则无任何报错。但是一旦超过超时时间。事物就会被强制中断。

select * from pg_stat_activity where pid<>pg_backend_pid();
-[ RECORD 3 ]----+--------------------------------------
datid            | 13285
datname          | postgres
pid              | 2015
usesysid         | 10
usename          | postgres
application_name | psql
client_addr      | 
client_hostname  | 
client_port      | -1
backend_start    | 2019-04-23 19:16:30.454131+08
xact_start       | 2019-04-23 21:25:04.850255+08
query_start      | 2019-04-23 21:25:46.20997+08
state_change     | 2019-04-23 21:25:46.210208+08
wait_event_type  | Client
wait_event       | ClientRead
state            | idle in transaction
backend_xid      | 606
backend_xmin     | 
query            | insert into test03 values (1,'dasd');
backend_type     | client backend

超时等待

我们等待20s至事物超时。
再在原事物中随便执行一个命令
可以发现已经报错

postgres=# select 1;
FATAL:  terminating connection due to idle-in-transaction timeout
server closed the connection unexpectedly
    This probably means the server terminated abnormally
    before or while processing the request.
The connection to the server was lost. Attempting reset: Succeeded.
postgres=# 

我们在看下之前我们创建的表和插入的一条数据,已经不存在了,说明此参数杀事物时采用回滚的方式

结语

该参数在复杂的应用场景中可能会满足客户的业务需求。具体的超时时间需要客户根据自己的业务类型来做出选择。但是宜多不宜少,过少的话会将一些正在进行的事物回滚,导致出错。过多的话只会让清理慢一些。影响相对小一点。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
国产化DM达梦数据库 - 用户状态查询、锁定与解锁,“登录失败次数超过限制”问题解决
国产化DM达梦数据库 - 用户状态查询、锁定与解锁,“登录失败次数超过限制”问题解决
896 0
PostgreSQL 数据库实例只读锁定(readonly) - 硬锁定,软锁定,解锁
PostgreSQL 数据库实例只读锁定(readonly) - 硬锁定,软锁定,解锁
1374 0
查看和设置数据库的兼容级别
查看数据库的兼容级别 连接到数据库引擎。 在标准菜单栏上,单击 “新建查询”。 将以下示例复制并粘贴到查询窗口中,然后单击“执行” 。 此示例将返回 AdventureWorks2012 数据库的兼容级别。
851 0
PostgreSQL 10.1 手册_部分 III. 服务器管理_第 27 章 恢复配置_27.2. 恢复目标设置
27.2. 恢复目标设置 默认情况下,恢复将会一直恢复到 WAL 日志的末尾。下面的参数可以被用来指定一个更早的停止点。在recovery_target、recovery_target_lsn、recovery_target_name、recovery_target_time和recovery_target_xid中,最多只能使用一个,如果在配置文件中使用了多个,将使用最后一个。
1306 0
+关注
云平_Stephen
一个DBA
文章
问答
文章排行榜
最热
最新
相关电子书
更多
数据库智能优化系统的探索与实践
立即下载
AliSQL 内核定制方案
立即下载
高可用数据库的搭建与备份恢复策略验证实战
立即下载