PostgreSQL的视图pg_locks
PostgreSQL的视图pg_locks
pg_locks
是 PostgreSQL 提供的系统视图,用于显示当前数据库中的锁信息。通过查询这个视图,数据库管理员可以监控锁的使用情况,识别潜在的锁争用和死锁问题,并优化数据库性能。
pg_locks
视图字段说明
以下是 pg_locks
视图中的一些主要字段及其说明:
- locktype:锁的类型,如 relation, extend, page, tuple, transaction, etc。
- database:对象所属数据库的 OID(对象 ID)。
- relation:表或索引的 OID(如果锁对象是一个表或索引)。
- page:页号(如果锁对象是一个页)。
- tuple:行号(如果锁对象是一个行)。
- virtualxid:虚拟事务 ID。
- transactionid:事务 ID(如果锁对象是一个事务)。
- classid:系统的 OID(如果锁对象是一个泛型的数据库对象)。
- objid:对象的 OID(如果锁对象是一个泛型的数据库对象)。
- objsubid:对象的子 ID(如果锁对象是一个泛型的数据库对象)。
- virtualtransaction:虚拟事务 ID,这是一个唯一标识后台进程的标识符。
- pid:持有锁的进程 ID。
- mode:锁的模式,如 AccessShareLock, RowExclusiveLock, RowShareLock, etc。
- granted:锁是否被授予(true 或 false)。
- fastpath:锁是否通过快速路径请求(true 或 false)。
使用示例
查询所有当前锁
通用查询:
SELECT * FROM pg_locks;
根据锁类型查询
例如,查询所有表级锁:
SELECT * FROM pg_locks WHERE locktype = 'relation';
或查询所有行级锁:
SELECT * FROM pg_locks WHERE locktype = 'tuple';
查询特定数据库的锁
可以根据数据库 OID 过滤锁信息:
SELECT * FROM pg_locks WHERE database = (SELECT oid FROM pg_database WHERE datname = 'your_database_name');
查询持有锁的进程
可以根据进程 ID 进行查询:
SELECT * FROM pg_locks WHERE pid = 12345;
查询等待锁的进程
通过过滤 granted
字段为 false 可以找到那些正在等待锁的进程:
SELECT * FROM pg_locks WHERE granted = false;
检测和处理锁争用
在 pg_stat_activity
中结合锁信息
可以将 pg_stat_activity
和 pg_locks
视图结合起来,查询所有正在等待锁的会话以及持有这些锁的会话:
SELECTpg_stat_activity.pid,pg_stat_activity.query,pg_locks.locktype,pg_locks.mode,pg_locks.relation::regclass,pg_locks.transactionid,pg_locks.virtualxid,pg_locks.virtualtransaction,pg_locks.granted
FROM pg_stat_activity
JOIN pg_locks ON pg_stat_activity.pid = pg_locks.pid
WHERE pg_locks.granted = false;
解除锁和终止会话
在某些情况下,可能需要手动解锁,例如当某个会话长时间持有锁导致其他事务无法正常进行。可以使用 pg_terminate_backend
函数来终止持有锁的会话:
获取持有锁的进程:
SELECT * FROM pg_locks WHERE mode = 'ExclusiveLock' AND granted = true;
执行终止进程操作:
假设需要终止 PID 为 12345 的会话:
SELECT pg_terminate_backend(12345);
示例脚本:查看锁争用情况并终止占用锁的会话
以下是一个结合 pg_locks
和 pg_stat_activity
的脚本,显示当前锁争用的情况并终止占用锁的会话:
-- 查看当前锁争用情况
SELECTwaiting_locks.pid AS waiting_pid,blocking_locks.pid AS blocking_pid,waiting_activity.query AS waiting_query,blocking_activity.query AS blocking_query
FROM pg_locks AS waiting_locks
JOIN pg_locks AS blocking_locksON waiting_locks.locktype = blocking_locks.locktypeAND waiting_locks.database IS NOT DISTINCT FROM blocking_locks.databaseAND waiting_locks.relation IS NOT DISTINCT FROM blocking_locks.relationAND waiting_locks.page IS NOT DISTINCT FROM blocking_locks.pageAND waiting_locks.tuple IS NOT DISTINCT FROM blocking_locks.tupleAND waiting_locks.virtualxid IS NOT DISTINCT FROM blocking_locks.virtualxidAND waiting_locks.transactionid IS NOT DISTINCT FROM blocking_locks.transactionidAND waiting_locks.classid IS NOT DISTINCT FROM blocking_locks.classidAND waiting_locks.objid IS NOT DISTINCT FROM blocking_locks.objidAND waiting_locks.objsubid IS NOT DISTINCT FROM blocking_locks.objsubidAND waiting_locks.pid <> blocking_locks.pid
JOIN pg_stat_activity AS waiting_activityON waiting_locks.pid = waiting_activity.pid
JOIN pg_stat_activity AS blocking_activityON blocking_locks.pid = blocking_activity.pid
WHERE NOT waiting_locks.granted;-- 终止占用锁的会话(需要确认后再执行)
SELECT pg_terminate_backend(blocking_locks.pid)
FROM pg_locks AS waiting_locks
JOIN pg_locks AS blocking_locksON waiting_locks.locktype = blocking_locks.locktypeAND waiting_locks.database IS NOT DISTINCT FROM blocking_locks.databaseAND waiting_locks.relation IS NOT DISTINCT FROM blocking_locks.relationAND waiting_locks.page IS NOT DISTINCT FROM blocking_locks.pageAND waiting_locks.tuple IS NOT DISTINCT FROM blocking_locks.tupleAND waiting_locks.virtualxid IS NOT DISTINCT FROM blocking_locks.virtualxidAND waiting_locks.transactionid IS NOT DISTINCT FROM blocking_locks.transactionidAND waiting_locks.classid IS NOT DISTINCT FROM blocking_locks.classidAND waiting_locks.objid IS NOT DISTINCT FROM blocking_locks.objidAND waiting_locks.objsubid IS NOT DISTINCT FROM blocking_locks.objsubidAND waiting_locks.pid <> blocking_locks.pid
WHERE NOT waiting_locks.granted;
小结
pg_locks
视图提供了监控和管理 PostgreSQL 中锁的详细信息。通过合理利用 pg_locks
,数据库管理员可以实时监控锁的使用情况,及时发现和解决锁争用问题,从而提高系统的并发性能和稳定性。
相关文章:
PostgreSQL的视图pg_locks
PostgreSQL的视图pg_locks pg_locks 是 PostgreSQL 提供的系统视图,用于显示当前数据库中的锁信息。通过查询这个视图,数据库管理员可以监控锁的使用情况,识别潜在的锁争用和死锁问题,并优化数据库性能。 pg_locks 视图字段说明…...

元宇宙NFG结合IPO线上营销模型合理降税
在当今快速演进的互联网和区块链技术背景下,我们见证了从移动端购物到区块链热潮,再到如今市场竞争日趋激烈的变革。尤其是在2024年这个关键节点,许多平台为了吸引用户,推出了各种创新的商业模式。然而,如何在这样的环…...

Python打印当前目录下,所有文件名的首字母
代码如下: #!/usr/bin/env python3 """ 按顺序打印当前目录下,所有文件名的首字母(忽略大小写) """ import sys from pathlib import Pathdef main() -> None:ps Path(__file__).parent.glob(…...

程序员应该有什么职业素养?
程序员的六大职业素养:构建成功职业生涯的基石 在不断变化的技术世界中,程序员不单要保持技术的锋利,也需要培养相应的职业素养,这些素养在很大程度上决定了一个程序员的职业生涯能否走得长远。以下是我认为最为重要的六大职业素…...

【PostgreSQL17新特性之-冗余IS [NOT] NULL限定符的处理优化】
在执行一个带有IS NOT NULL或者NOT NULL的SQL的时候,通常会对表的每一行,都会进行检查以确保列为空/不为空,这是符合常理的。 但是如果本身这个列上有非空(NOT NULL)约束,再次检查就会浪费资源。甚至有时候…...

Flink的简单学习二
一 Flink的核心组件 1.1 client 1.将数据流程图DataFlow发送给JobManager。 1.2 JobManager 1.收集client的DataFlow图,将图分解成一个个的task任务,并返回状态更新数据给client 2.JobManager负责作业调度,收集TaskManager的Heartbeat和…...
如何提高员工的工作主动性?
在现代竞争激烈的商业环境中,拥有高度主动性的员工是每个组织所追求的目标。主动性不仅能够促进员工的个人成长,还可以提升团队的效率和创新力。因此,如何提高员工的工作主动性成为了企业管理者需要关注的重要问题。那么如何培养和激发员工的…...
FFmpeg PCM编码为AAC
使用FFmpeg库把PCM文件编码为AAC文件,FFmpeg版本为4.4.2-0 代码如下: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <libavcodec/avcodec.h> #include <libavformat/avformat.h> #include <…...
React@16.x(16)Render Props
目录 1,问题描述2,解决方式2.1,Render Props2.2,HOC 3,使用场景 1,问题描述 当使用组件时,标签中的内容,会被当做 props.children 来渲染: 子组件: import…...
STM32 定时器问题
stm32通用定时器中断问题 STM32 定时器有时一开启就进中断的问题 /// STM32 TIM1高级定时器RCR重复计数器的理解 /// /// /// /// /// /// /// ///...

CSS学习笔记目录
CSS学习笔记之基础教程(一) CSS学习笔记之基础教程(二) CSS学习笔记之中级教程(一) CSS学习笔记之中级教程(二) CSS学习笔记之中级教程(三) CSS学习笔记之高级…...

随笔-我在武汉一周了
做梦一样,已经来武汉一周了,回顾一下这几天,还真是有意思。 周一坐了四个小时的高铁到了武汉站,照着指示牌打了个出租车。司机大姐开得很快,瞅了眼,最快速度到了110,差点把我晃晕。一下车就感觉…...
Python 爬虫零基础:探索网络数据的神秘世界
Python 爬虫零基础:探索网络数据的神秘世界 在数字化时代,网络数据如同无尽的宝藏,等待着我们去发掘。Python爬虫,作为获取这些数据的重要工具,正逐渐走进越来越多人的视野。对于零基础的学习者来说,如何入…...
微信小程序的view的属性值和用法
在微信小程序中,view 是一个基础的视图组件,用于承载其他视图组件或者展示文本、图片等内容。view 组件具有多种属性,用于控制其行为和样式。以下是一些常用的 view 属性及其用法: class / style: 控制视图的样式,可以…...
Python优化、异常处理与性能提升技巧
Python作为一种高效的编程语言,其灵活性和强大的功能使得它成为了许多开发者的首选。在日常的编程实践中,掌握一些高效的Python技巧可以极大地提升开发效率和代码质量。本文将介绍五个关于Python使用技巧,帮助你更加熟练地运用Python解决问题…...

Flink状态State | 大数据技术
⭐简单说两句⭐ ✨ 正在努力的小叮当~ 💖 超级爱分享,分享各种有趣干货! 👩💻 提供:模拟面试 | 简历诊断 | 独家简历模板 🌈 感谢关注,关注了你就是我的超级粉丝啦! &a…...
go语言方法之方法值和方法表达式
我们经常选择一个方法,并且在同一个表达式里执行,比如常见的p.Distance()形式,实际上 将其分成两步来执行也是可能的。p.Distance叫作“选择器”,选择器会返回一个方法"值"->一 个将方法(Point.Distance)绑定到特定接…...

TDMQ CKafka 版弹性存储能力重磅上线!
导语 自 2024年5月起,TDMQ CKafka 专业版支持弹性存储能力,这种产品形态下,存储可按需使用、按量付费,一方面降低消费即删除、存储使用波动大场景下的存储成本,另一方面存储空间理论上无穷大。 TDMQ CKafka 版产品能…...

24、Linux网络端口
Linux网络端口 1、查看网络接口信息ifconfig ens33 eth0 文件 ifconfig 当前设备正在工作的网卡,启动的设备。 ifconfig -a 查看所有的网络设备。 ifconfig ens33 查看指定网卡设备。 ifconfig ens33 up/down 对指定网卡设备进行开关 基于物理网卡设备虚拟的…...
Mysql全文搜索和LIKE搜索有什么区别
全文搜索和LIKE的区别 性能:在大数据集上,全文搜索通常比LIKE查询更快,因为它使用了专门的索引结构。 功能:全文搜索提供了更丰富的查询功能,如多个关键词的搜索、自然语言搜索、布尔搜索等。而LIKE通常只支持简单的…...
浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)
✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...
设计模式和设计原则回顾
设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

linux之kylin系统nginx的安装
一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源(HTML/CSS/图片等),响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址,提高安全性 3.负载均衡服务器 支持多种策略分发流量…...
ffmpeg(四):滤镜命令
FFmpeg 的滤镜命令是用于音视频处理中的强大工具,可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下: ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜: ffmpeg…...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...

【单片机期末】单片机系统设计
主要内容:系统状态机,系统时基,系统需求分析,系统构建,系统状态流图 一、题目要求 二、绘制系统状态流图 题目:根据上述描述绘制系统状态流图,注明状态转移条件及方向。 三、利用定时器产生时…...
ip子接口配置及删除
配置永久生效的子接口,2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...
python报错No module named ‘tensorflow.keras‘
是由于不同版本的tensorflow下的keras所在的路径不同,结合所安装的tensorflow的目录结构修改from语句即可。 原语句: from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后: from tensorflow.python.keras.lay…...

基于IDIG-GAN的小样本电机轴承故障诊断
目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) 梯度归一化(Gradient Normalization) (2) 判别器梯度间隙正则化(Discriminator Gradient Gap Regularization) (3) 自注意力机制(Self-Attention) 3. 完整损失函数 二…...

windows系统MySQL安装文档
概览:本文讨论了MySQL的安装、使用过程中涉及的解压、配置、初始化、注册服务、启动、修改密码、登录、退出以及卸载等相关内容,为学习者提供全面的操作指导。关键要点包括: 解压 :下载完成后解压压缩包,得到MySQL 8.…...