GreatSQL社区

搜索

MySQL全局读锁模拟

46 6 2025-1-6 14:42
问题背景:

在一天早上,mysql从库的主从延时不断增大,并且出现了告警,业务方找到了我们。

问题分析:
我们登录了从库,用 show processlist进行了查看,发现有备份任务在获取全局读锁卡在了那里。如下图:


处理办法:
我们kill了获取全局读锁对应的进程,发现主从状态立刻正常了,主从延时也在不停减小,问题就此解决了。

现在的问题:
我们想模拟生产环境中 show processlist 看到 flush table with read lock 数据库夯住的状态一直模拟不出来。想寻求各位大佬的帮助,帮忙在本地环境中模拟出这个状态,谢谢。

全部回复(6)
yejr 2025-1-6 14:47:08
这是因为有个事务一直没提交,而备份任务需要发起 flush table with read lock 会被阻塞,进而继续阻塞后面的其他请求。
蒋士峰 2025-1-6 14:51:38
yejr 发表于 2025-1-6 14:47
这是因为有个事务一直没提交,而备份任务需要发起 flush table with read lock 会被阻塞,进而继续阻塞后面 ...

我在本地环境中模拟,只模拟出了 Waiting for global read lock 这个现象,没有模拟出截图出现的现象。怎么模拟呢?
蒋士峰 2025-1-6 16:37:54
本帖最后由 蒋士峰 于 2025-1-6 16:40 编辑
yejr 发表于 2025-1-6 14:47
这是因为有个事务一直没提交,而备份任务需要发起 flush table with read lock 会被阻塞,进而继续阻塞后面 ...

-- Session 1
START TRANSACTION;
LOCK TABLES t100w WRITE;

SELECT * FROM t100w;

-- 不提交或回滚

-- Session 2
START TRANSACTION;
FLUSH TABLES WITH READ LOCK;





现在只模拟出了这个效果,怎样让 state 这个列的状态为 waiting for commit lock 这个状态?
yejr 2025-1-6 16:43:08
蒋士峰 发表于 2025-1-6 16:37
-- Session 1
START TRANSACTION;
LOCK TABLES t100w WRITE;

把session1的操作修改为下面这样即可

-- Session 1
START TRANSACTION;
SELECT * FROM t100w LIMIT 1 FOR SHARE;
-- 一直不提交该事务
蒋士峰 2025-1-6 16:50:24
本帖最后由 蒋士峰 于 2025-1-6 16:51 编辑
yejr 发表于 2025-1-6 16:43
把session1的操作修改为下面这样即可

-- Session 1

这样会报语法错误的。


-- Session 1
START TRANSACTION;
SELECT * FROM t100w LIMIT 1 lock in share mode;
-- 不提交或回滚



试着用这个语句,但是没有出效果,这次没有阻塞。



yejr 2025-1-6 16:55:13
蒋士峰 发表于 2025-1-6 16:50
这样会报语法错误的。

把session1改成在事务里任意修改/删除几行数据看看
蒋士峰

1

主题

0

博客

5

贡献

新手上路

Rank: 1

积分
9

合作电话:010-64087828

社区邮箱:greatsql@greatdb.com

社区公众号
社区小助手
QQ群
GMT+8, 2025-1-18 13:13 , Processed in 0.036026 second(s), 15 queries , Redis On.
快速回复 返回顶部 返回列表