资讯专栏INFORMATION COLUMN

PostgreSQL9.6:新增加“idle in transaction”超时空闲事务自动查杀功能

meislzhua / 3497人阅读

摘要:以上出自发行说明,这段指出版本支持自动查杀超过指定时间的空闲事务连接,下面演示下。修改以下参数备注参数单位为毫秒,这里设置超时空闲事务时间为秒。数据库日志备注数据库日志里清晰地记录了进程的连接由于空闲事务超时被断开连接。

熟悉 PostgreSQL 的朋友应该知道 “idle in transaction” 进程,引发 idle in transaction 的原因很多,例如应用代码中忘记关闭已开启的事务,或者系统中存在僵死进程等,曾经看到过某个库中的 idle in transaction 进程存在一年有余,这类进程严重危害了数据库的安全,例如它会阻止 VACUUM 进程回收记录,造成表数据膨胀,同时它有可能引起整个 PostgreSQL 数据库 Transaction ID Wraparound 的风险。

Allow sessions to be terminated automatically if they sit too long in
an idle-in-transaction state (Vik Fearing) This behavior is enabled
and controlled by the new configuration parameter
idle_in_transaction_session_timeout. It can be useful to prevent
forgotten transactions from holding onto locks or preventing vacuum
cleanup for very long periods.

以上出自 PostgreSQL9.6 Beta1 发行说明,这段指出9.6版本 PostgreSQL 支持自动查杀超过指定时间的 idle in transaction 空闲事务连接,下面演示下。

--修改 postgresql.conf 以下参数

idle_in_transaction_session_timeout = 20000

备注:参数单位为毫秒,这里设置 idle in transaction 超时空闲事务时间为 20 秒。

--重载配置文件

[pg96@db1 pg_root]$ pg_ctl reload
server signaled

备注:此参数修改后对当前连接依然生效,应用不需要重连即能生效。

--开启会话一:模拟一个事务

[pg96@db1 ~]$ psql francs francs
psql (9.6beta1)
Type "help" for help.

francs=> begin;
BEGIN

francs=> select 1;
 ?column? 
----------
        1
(1 row)

事务中,不提交也不回滚。

--开启会话二:监控

postgres=# select * from pg_stat_activity where pid<>pg_backend_pid();
-[ RECORD 1 ]----+------------------------------
datid            | 16386
datname          | francs
pid              | 7776
usesysid         | 16384
usename          | francs
application_name | psql
client_addr      | 
client_hostname  | 
client_port      | -1
backend_start    | 2016-06-01 16:03:12.557328+08
xact_start       | 2016-06-01 16:03:16.921353+08
query_start      | 2016-06-01 16:03:18.754706+08
state_change     | 2016-06-01 16:03:18.755422+08
wait_event_type  | 
wait_event       | 
state            | idle in transaction
backend_xid      | 
backend_xmin     | 
query            | select 1;

postgres=# select * from pg_stat_activity where pid<>pg_backend_pid();
(0 rows)

备注:开始还能监控到这个 "idle in transaction" 的事务,大概过了 20秒后,这个事务查询不到了。

--再回到会话一

francs=> select 1;
 ?column? 
----------
        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.

备注:回到会话一执行 select 1 测试命令,发现连接被断开了,报错代码很明显,idle-in-transaction 超时了。

--数据库日志

2016-06-01 16:03:38.756
CST,"francs","francs",7776,"[local]",574e96c0.1e60,1,"idle in
transaction",2016-06-01 16:03:12 CST,2/5887,0,FATAL,25P03,"terminating
connection due to idle-in-transaction timeout",,,,,,,,,"psql"

备注:数据库日志里清晰地记录了 7796 进程的连接由于空闲事务超时被断开连接。

--参考
idle_in_transaction_session_timeout (integer)
Preventing Transaction ID Wraparound Failures

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/38975.html

相关文章

  • PostgreSQL9.6增pg_blocking_pids函数准确定位 Blocking SQ

    摘要:创建测试表会话一备注会话一在事务里更新的记录,并不提交。会话二备注会话二删除的记录,此时由于这条记录之前被并没有提交,这句仍然处于等待状态。 PosttgreSQL 的SQL被锁情况在数据库维护过程中非常常见,之前博客 PostgreSQL 锁分析 演示了 PostgreSQL 锁的一些场景,在开始本文的介绍之前特做以下说明,假如会话A堵住会话B,我们称会话B为 blocked 会话...

    liuchengxu 评论0 收藏0
  • MyBatis 源码阅读之数据库连接

    摘要:源码阅读之数据库连接的配置文件所有配置会被类读取,我们可以通过此类来了解各个配置是如何运作的。也就是说的统计字段是关于整个数据源的,而一个则是针对单个连接的。 MyBatis 源码阅读之数据库连接 MyBatis 的配置文件所有配置会被 org.apache.ibatis.builder.xml.XMLConfigBuilder 类读取,我们可以通过此类来了解各个配置是如何运作的。而 ...

    TwIStOy 评论0 收藏0
  • 数据库相关异常分析

    摘要:起因最近一段时间,生产系统持续碰到一些数据库异常,导致执行失败。综上,若发生异常,为数据库连接失效,但是失效的原因可能会有多种,大致都与各种参数相关。当时数据量大概多条,然后在批量插入时抛出该异常。 起因 最近一段时间,生产系统持续碰到一些数据库异常,导致 sql 执行失败。 应用环境 Java 1.7 + Mysql 5.6 + spring + ibatis 问题排查 将各种失败的...

    IamDLY 评论0 收藏0
  • MongoDB 客户端连接选项

    摘要:原文保持更新及修正基于的客户端配置选项,其它驱动大同小异。连接池中连接的最大使用寿命毫秒。设置该选项后,客户端将进行以下行为以副本集模式连接,并根据给定的服务器发现副本集的所有成员。该选项可以和配合使用。编解码器用于对进行编码和解码。 原文保持更新及BUG修正:http://kweny.io/mongodb-clien... 基于 MongoDB Java Driver 3.8.1 ...

    yexiaobai 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<