mysql8查看大事务

news/2024/11/29 1:39:58/

文章目录

    • 1、查看大事务的原因
    • 2、构建测试数据
    • 3、模拟大事务场景
    • 4、查询mysql的事务
    • 5、查询大事务的详情

1、查看大事务的原因

大事务的特点是执行时间长,长期占有锁不释放,导致其他想操作同一行数据的线程阻塞,如果客户端设置了超时时间,超时后,客户端进行重试,又会申请一个mysql线程,然后再阻塞,最终会造成整个mysql库的线程枯竭,整个mysql库不可用,危害极大。
所以,对于开发人员来说,非常有必要知道如何查看长事务,如何终止掉大事务。

2、构建测试数据

很简单,就搞一张表,一个主键,一个业务字段。DDL语句如下

CREATE TABLE `user_read`  (`userId` int NOT NULL,`userName` varchar(12) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,PRIMARY KEY (`userId`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

再搞两条测试数据

INSERT INTO `user`.`user_read` (`userId`, `userName`) VALUES (1, 'test1');
INSERT INTO `user`.`user_read` (`userId`, `userName`) VALUES (2, 'test2');

3、模拟大事务场景

1)、修改事务超时时间
默认的事务超时时间是50秒,不便于我们拍查问题,所以我们可以根据以下sql修改事务的默认超时时间。注意:修改后,需要关闭当前的mysql连接,重新登录mysql才能生效。

#单位是秒,默认值是50秒
set global innodb_lock_wait_timeout=5000;

2)、开一个会话A,执行以下sql,模拟大事务
我们手动构建一个加了排他锁的查询语句,只开启事务,不提交语句

BEGIN;
select * from user_read where userId=1 for update;

因为加了排他锁,执行完语句后,不提交事务,所以这就模拟了一个大事务的请求。
3)、再开一个会话B,执行以下sql,模拟并发的请求

UPDATE user_read SET userName = 'test3' WHERE userId = 1;

此时,因为行锁未释放,所以这条语句会阻塞住。这条语句就是模拟:在大事务存在的情况下,其他请求是不能操作同一行数据的。这样做,明显会影响数据库的并发性能。

4、查询mysql的事务

1)、首先查看一下目前数据库中存在哪些事务

SELECT * FROM information_schema.INNODB_TRX

结果如下图:
查看mysql中有哪些正在执行的事务
2)、解读一下这两条记录
可以看到目前库中有2个事务,事务id分别是:4220、4219。
4219事务的执行状态是RUNNING、4220事务的执行状态是LOCK_WAIT。
RUNNING的意思是:当前事务正在执行。也就是我们在会话A中手动构建的那个大事务。虽然sql已经执行完,但是我们没有提交事务,所以INNODB_TRX表中就还能查到这个事务。但是因为sql语句已经执行完了,所以trx_query字段就没有信息了。
LOCK_WAIT的意思是:当前事务在等待锁,也就是我们在会话B中手动构建的update语句。因为这个事务还在等待锁,所以update语句并没有执行,所以trx_query字段能查询到当前待执行的sql语句。

3)、阶段性的排查结论
通过以上排查,我们已经知道了目前数据库中存在正在执行的大事务,并且还知道已经出现了锁等待的情况。此刻,我们迫切想要知道的是这个大事务的sql是啥,能不能kill掉。但是因为大事务已经执行了sql语句,所以trx_query中没有了sql信息。所以我们要通过mysql的其他表查询这个大事务的详情,尤其是大事务的sql语句,进而知道是在做什么业务。

5、查询大事务的详情

1)、查看哪些事务被阻塞了,被谁阻塞了

select * from sys.innodb_lock_waits;

结果
查看大事务的pid
可以看到有一条UPDATE语句被阻塞了,阻塞者的id是22,这个id是22的事务就是我们排查的目标。接下来就是根据这个22继续查找详细信息。

2)、查询执行大事务的mysql线程id

select thread_id,processlist_id from performance_schema.threads where processlist_id=22;

结果:
查询执行大事务的线程id
得到了执行大事务的线程id,接下来用这个线程id查询大事务对应的sql。
3)、查询大事务的sql信息

select thread_id,sql_text from performance_schema.events_statements_history where thread_id=62;

结果:
在这里插入图片描述
至此,我们就得到了大事务的sql语句,接下来,可以根据sql语句对应一下业务模块,进而得出这个大事务能不能kill。如果确定可以kill,我们可以使用以下语句kill掉这个大事务

kill 22

注意:这个语句要在mysql的sql窗口执行,不是在linux服务器中执行。

参考:
https://www.51cto.com/article/743732.html


http://www.ppmy.cn/news/329113.html

相关文章

4年功能庸庸碌碌,进阶自动化测试拿到了24k,测试之路不再平凡...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 手工测试如何进阶…

Vulnhub靶机渗透:MY FILE SERVER: 1

MY FILE SERVER: 1 nmap扫描端口扫描服务扫描漏洞扫描选择渗透方向 21/2121 ftp445 samba2049/20048 nfs80 http目录爆破 获得立足点提权4061140847 获取flag 靶机链接: https://www.vulnhub.com/entry/my-file-server-1,432/ 靶机IP:192.168.54.33 kali IP&#x…

解压密码忘记了怎么办

压缩包带有密码,想要解压文件就必须要输入压缩包密码才能解压出文件的。 所以建议大家,在给压缩包加密之后,一定要设置简单的密码或者是记住密码、或者把密码记录在一个地方。一个压缩包名对应一个密码,这样以后就算忘记了密码&a…

有了面容解锁忘记了锁屏密码

现在的苹果手机,大多数都是指纹解锁或者面容解锁了,可是苹果还是保留着密码锁,一般手机重启,面容或指纹解锁次数过多的时候需要输入密码才能解锁手机,对于不经常用到的屏幕密码忘记了就不方便了。 使用okfone 苹果解锁…

IDEA安装 激活 基本使用

什么是IDEA IDAE前程Intellij IDEA,是用于Java语言开发的集成环境,他是业界公认的目前用于Java程序开发的最好工具。 IDEA下载安装 官网:https://www.jetbrains.com/idea/ 官网页面点击Download 社区版免费但阉割,专业版可免费使用30天学…

JavaMail学习笔记(七)、帐号激活与忘记密码 实例

一、帐户激活 在很多时候,在某些网站注册一个用户之后,网站会给这个用户注册时填写的email地址发送一封帐户激活邮件,这封邮件的内容就是一个激活帐户的链接和一段简短的文字描述,如果用户没有去邮箱将帐户激活,可能在…

Mina MEID/GSM Activator 1.0 三网信号激活,支持iOS12.0~14.8.1

Mina团队已经更新工具,现在支持MEID/GSM三网和两网解锁信号!支持iOS14.8系统,两网价格和三网价格一样。 Mina MEID/GSM Activator可以激活所有MEID/GSM二网、三网恢复信号,并且支持打电话、短信、4G流量上网,支持iPhon…

Tomato绕激活工具,支持两网信号/修复通知/游戏机

大家好,辣条科技全面升级,注册网络科技公司及线下及线上运营团队,今天也给大家带来一款新的绕激活软件。也可以叫offit的升级版! 改名为:tomato (番茄)全新界面/全新后台/全新工具/全心服务 t…