postgresql|数据库|pg_repack和idle_in_transaction_session_timeout参数的关系

server/2024/9/19 16:31:58/ 标签: 数据库, postgresql, 服务器, 开发语言, 运维, linux

一、问题描述

在使用pg_repack这个工具做数据库的表膨胀清理过程中,经常会遇到类似这样的警告:

这里的警告表明在膨胀治理的时候,此表遇到了事务阻塞,而此时我们有三种选择,第一个选择是等待该事务结束,第二个选择是主动结束该事务,第三个选择是利用pg数据库的自身机制自动结束该事务;只有事务阻塞的情况解决了,才能够顺利的完成表膨胀的治理

查询上面警告的进程,可以看到该进程的连接状态是idle in transaction

二、数据库进程和数据库连接状态

那么,在解决此问题前,先来了解一下数据库连接的几种状态。

pg_stat_activity

pg_stat_activity 是一张postgresql数据库内的系统视图,它的每一行都表示一个系统进程,显示与当前会话的活动进程的一些信息,比如当前会话的状态和查询等。

在平时查询pg_stat_activity这个视图的时候,每一行包含了一个进程的相关信息,包含当前正在执行的SQL,或者会话的状态等等,state字段表示当前进程的状态。

在PostgreSQL数据库里,其实代码里总共定义了7种BackendState,但是最终给我们展现在pg_stat_activity里显示的只有6种,这个不显示的STATE_UNDEFINED是PostgreSQL中定义的一个连接状态。它表示客户端连接到服务器,但服务器无法确定连接的状态,这里这个特殊的状态本文就不过多解读了,并不是本文的重点它的state字段表示当前进程的状态,一共有六种:

1、Active(活动): 进程正在执行某个语句,处于活跃状态
2、Idle(空闲): 进程正在等待客户端的指令
3、idle in transaction(事务空闲):进程开启了事务,但当前没有提交任何语句,这里的事务可以是查询语句,也可以是插入语句,总之,DML语句和DDL语句都可以
4、idle in transaction (aborted)(事务空闲-退出):进程开启了事务,但当前没有提交任何语句。并且事务中的一个语句报错退出。(一般整个事物回滚后的状态)
除了事务中声明一个错误外,其余情况与idle in transaction相同
5、fastpath function call(快速通道函数调用): 后台正在执行某个快速通道函数
6、Disabled(禁用): 如果后台禁用track_activities,则报告这个状态

这里主要介绍下idle in transaction,它是一种特殊的进程状态,也就是上面图片里的示例,它表示进程里的一个事务已经开始,但尚未完成。当一个事务处于idle in transaction状态时,它可以接受新的查询,但不能提交或回滚。这种状态通常是由于客户端应用程序在发送查询之后没有发送提交或回滚指令而导致的。可能在业务应用代码中忘记关闭已开启的事务,或者系统中存在僵死进程等。

idle in transaction进程过多的危害:

数据库里长时间存在idle in transaction状态的进程,会严重影响数据库的性能,因为它会阻止其他事务的执行,从而影响数据库的性能。此外,如果一个事务处于idle in transaction状态太长时间,它会阻止VACUUM进程回收空间,当然了,也会阻止pg_repack回收磁盘空间,进而造成表数据膨胀,会导致事务ID wraparound,甚至严重可能会占用大量的内存,从而导致数据库崩溃。

数据库的一个比较重要的原则是 快进快出,该原则同样适用于vacuum,pg_repack 清理表膨胀的时候遇到事务阻塞的情况,也就是说,事务能够尽快开始并且尽快的结束是最好的情况

三、

手动清理长时间挂起的事务

第一个SQL语句是查询事务阻塞的进程pid,第二个SQL语句是结束查询到的进程pid

很明显的,手动清理阻塞事务是比较繁琐的,通常需要清理的pid很多,工作量很大,此种方式十分不推荐

SELECT pid, pg_stat_get_backend_activity(pid) AS queryFROM pg_stat_activityWHERE state = 'idle in transaction';SELECT pg_terminate_backend(pid)FROM pg_stat_activityWHERE state = 'idle in transaction' AND pid = <进程ID>;

将 <进程ID> 替换为你要终止的进程的实际 ID。这将终止与指定进程关联的数据库事务。

请注意,终止一个进程将导致未提交的事务回滚,并释放相关的资源。在执行此操作之前,请确保你了解可能带来的影响。

四、

postgresql数据库自动清理长时间挂起的事务

PostgreSQL 9.6版本开始支持了idle_in_transaction_session_timeout参数,也就是上面我们所说的第三种选择---自动查杀idle_in_transaction_session_timeout进程,这个参数可以自动查杀超过指定时间的 idle in transaction 空闲事务连接,用于清理应用代码中忘记关闭已开启的事务,或者系统中存在僵死进程等。(在postgresql数据库的主配置文件内修改此参数,默认是0,关闭状态)
 

那么,这个参数到底如何配置呢?该参数是毫秒,比如设置idle_in_transaction_session_timeout=20000 意思就是20秒以上idle_in_transaction_session状态的进程postgresql数据库会给你自动清理掉,🆗,如果你的数据库读写性能比较差,一个正常发起的事务一般都会超过20秒,那么,将此参数增大,比如增大到60000,也就是60秒就可以了。通常可以问开发,确认自己数据库的事务执行提交时间。

需要注意的是,修改idle_in_transaction_session_timeout参数只需要重载数据库配置文件(也就是在命令行执行 selec pg_reload_conf(); 这个函数),并不需要重启数据库服务,而且它不会影响idle状态的事物。

据观察,idle_in_transaction_session_timeout参数设置后,不管设置多少,至少pg_repack 在清理表膨胀的时候再也没有遇到因事务阻塞而需要等待的情况了


http://www.ppmy.cn/server/117780.html

相关文章

机器学习 vs. 深度学习

目录 引言 机器学习 深度学习 机器学习与深度学习的区别概览 引言 随着人工智能技术的发展&#xff0c;机器学习&#xff08;Machine Learning&#xff09;和深度学习&#xff08;Deep Learning&#xff09;成为了当今最热门的研究领域之一。尽管这两个术语经常被交替使用&…

【代码随想录训练营第42期 Day57打卡 - 图论Part7 - Prim算法与Kruskal算法

目录 一、Prim算法 二、题目与题解 题目&#xff1a;卡码网 53. 寻宝 题目链接 题解1&#xff1a;Prim算法 题解2&#xff1a;Prim算法优化 题解3&#xff1a;Kruskal算法 三、小结 一、Prim算法与Kruskal算法 Prim算法是一种贪心算法&#xff0c;用于求解加权无向图的…

构建高效 Python Web API:RESTful 设计与 GraphQL 实践

构建高效 Python Web API&#xff1a;RESTful 设计与 GraphQL 实践 在现代 Web 开发中&#xff0c;API 是前后端通信的核心枢纽&#xff0c;设计一个高效且易于扩展的 API 是保证系统良好运行的基础。本文详细探讨 RESTful API 的设计准则&#xff0c;如何生成 API 文档&#…

HCIP--<OSPF2>

目录 一&#xff0c;OSPF的不规则区域 1&#xff09;远离骨干区域的非骨干区域 2&#xff09;不连续骨干区域(和上面一样) 二&#xff0c;OSPF数据库表 三。优化OSPF的LSA&#xff08;缺少LSA的更新量&#xff09; [1]手工汇总&#xff1a;减少骨干区域的LSA [2]特殊区域&…

轨道列车舱门检测系统源码分享

轨道列车舱门检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer…

GitHub图床

GitHub图床 文章目录 GitHub图床图床介绍Github访问GitHub手动修改hostsgithub520 加速器创建账户创建仓库创建token PicGoTypora 图床介绍 图床 存放图片的地方 为什么设置图床呢 在我认识图床之前, 有一个问题 [^放在typora上面的图片, 其实是一个链接, 并且将图片存放在本地…

TS - tsconfig.json 和 tsconfig.node.json 的关系,如何在TS 中使用 JS 不报错

目录 1&#xff0c;前言2&#xff0c;二者关系2.1&#xff0c;使用 3&#xff0c;遇到的问题3.1&#xff0c;TS 中使用 JS 1&#xff0c;前言 通过 Vite 创建的 Vue3 TS 项目&#xff0c;根目录下会有 tsconfig.json 和 tsconfig.node.json 文件&#xff0c;并且存在引用关系…

51单片机+proteus+实验(I2C和蜂鸣器)

目录 1.蜂鸣器 1.1基本概念 1.1.1蜂鸣器的简介 1.1.2蜂鸣器的硬件原理 1.1.3蜂鸣器的音色 1.2代码 1.2.1不同音色驱动 1.2.2使用Music Encode1软件来生成音乐 1.3proteus仿真 2.I2C 2.1基本概念 2.1.1 I2C的基本概念 2.1.2 I2C的通讯时序 2.1.3AT24C02数据帧 ​编…

Qt_显示类控件

目录 一、QLabel 1、QLabel属性介绍 2、textFormat文本格式 3、pixmap标签图片 3.1 resizeEvent 4、QFrame边框 5、alignment文本对齐 6、wordWrap自动换行 7、indent设置缩进 8、margin设置边距 9、buddy设置伙伴 二、QLCDNumber 1、QLCDNumber属性介绍 2、实…

【AI大模型】ChatGPT模型原理介绍(下)

目录 &#x1f354; GPT-3介绍 1.1 GPT-3模型架构 1.2 GPT-3训练核心思想 1.3 GPT-3数据集 1.4 GPT-3模型的特点 1.5 GPT-3模型总结 &#x1f354; ChatGPT介绍 2.1 ChatGPT原理 2.2 什么是强化学习 2.3 ChatGPT强化学习步骤 2.4 监督调优模型 2.5 训练奖励模型 2.…

上海亚商投顾:沪指探底回升 华为产业链午后爆发

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 沪指昨日探底回升&#xff0c;深成指、创业板指盘中跌逾1%&#xff0c;午后集体拉升翻红。华为产业链午后走强…

朴朴超市 签到 任务脚本

脚本主要用于自动化处理朴朴超市APP的签到和组队任务。以下是对脚本中主要方法的作用解析: 初始化和登录 - __init__: - 初始化类对象,设置用户信息和请求头,尝试获取并设置随机位置。 - get_AccessToken: - 使用`refresh_token`刷新并获取`access_token`,用于后续的A…

安卓玩机工具-----ADB与 FASTBOOT模式 图形化 多功能玩机刷机工具

工具说明 这款工具是英文版。易于使用的工具提供了用于运行 ADB 和 Fastboot 命令的图形用户界面。ADB 功能包括旁加载、安装和卸载应用程序、测试设备以及重新启动到不同的模式。可以使用 fastboot 命令进行设备管理;其中包括检查 Antirollback 和 active slots 等变…

Nginx:高性能的Web服务器与反向代理

在当今的互联网世界中&#xff0c;Web服务器的选择对于网站的性能、稳定性和安全性至关重要。Nginx&#xff08;发音为“engine X”&#xff09;凭借其卓越的性能、丰富的功能集和灵活的配置选项&#xff0c;成为了众多网站和应用程序的首选Web服务器和反向代理。本文将深入探讨…

Canal+RabbitMQ数据同步环境配置

Canal 是阿里巴巴开发的开源工具&#xff0c;主要用于解析 MySQL 的 binlog 日志&#xff0c;从而实现数据同步。Canal 会模拟 MySQL 从库的协议&#xff0c;订阅主库的 binlog&#xff0c;从而获取数据库的变更信息。 将 Canal 解析到的 MySQL 数据库变更消息通过 RabbitMQ 分…

详细分析Uniapp中的轮播图基本知识(附Demo)

目录 前言1. 基本知识2. Demo2.1 基本2.2 自定义分页2.3 自定义动画 3. 扩展 前言 先看代码示例&#xff1a; 实现了一个带有分页指示器的轮播图组件 <template><view class"work-container"><!-- 轮播图 --><uni-swiper-dot class"uni…

flask框架

Flask 1 flask简介 我们之所以在浏览器中输入localhost:8080然后就可以把webapps下面的项目文件以浏览器的方式打开&#xff0c;功臣在与tomcat。python语言写的项目&#xff0c;转换为web&#xff0c;Flask框架 轻量级web应用框架。 环境准备&#xff1a; pip install fl…

SSHamble:一款针对SSH技术安全的研究与分析工具

关于SSHamble SSHamble是一款功能强大的SSH技术安全分析与研究工具&#xff0c;该工具基于Go语言开发&#xff0c;可以帮助广大研究人员更好地分析SSH相关的安全技术与缺陷问题。 功能介绍 SSHamble 是用于 SSH 实现的研究工具&#xff0c;其中包含下列功能&#xff1a; 1、针…

React源码学习(一):如何学习React源码

本系列源码学习&#xff0c;是基于 v16.13.1&#xff0c;v17.x与v16.x区别并不太大&#xff01; 一、如何正确的学习React源码&#xff1f; 找到Github&#xff0c;转到React仓库&#xff0c;fork / clone源码&#xff1a;React 查看Readme&#xff0c;在Documentation中有Cont…

Gateway学习笔记

目录 介绍&#xff1a; 核心概念 依赖 路由 断言 基本的断言工厂 自定义断言 过滤器 路由过滤器 过滤器工厂 自定义路由过滤器 全局过滤器 其他 过滤器执行顺序 前置后置&#xff08;&#xff1f;&#xff09; 跨域问题 yaml 解决 配置类解决 介绍&#x…