返回

故障分析:全局读锁一直没有释放

发布时间:2022-11-01 19:31:00 330
# mysql# 数据库# sql# 数据# 监控
  • ​FLUSH TABLES WITH READ LOCK​
ps aux | grep mysqldump 

show processlist;
show open tables where in_use > 0;

线上没有开启 ​​performance_schema​​​ 的 ​​instruments​​​ 和 ​​consumers​​​(PS:这个对于锁监控很重要,一定记得打开)。如果开启了 ​​performance_schema​​​,可以通过 ​​metadata_locks​​ 查到相关锁记录,这个我们在后面的复现中看一下。

select * from metadata_locks;
select * from threads order by processlist_time desc limit 10;

原因

mysql备份时使用​​--master-data​​​参数在​​SQL​​​文件的头部会写入​​binlog​​​和​​position​​​信 息,所以在执行备份前mysql需要执行​​flush tables​​​。​​flush tables with read lock​​ 全局锁锁住整个数据库。如果数据库中有一个长查询在运行,那么FTWRL就不能获得,会被阻塞,进而阻塞所有的DML操作。

排查

开启慢日志:

SET GLOBAL log_slow_queries = ON; 
SET GLOBAL long_query_time = 3;
set global slow_query_log_file='/opt/mysql/slow.log'

查看锁表

select * from metadata_locks;
select * from threads order by processlist_time desc limit 10;

查出锁源 SQL 语句

SELECT THREAD_ID, SQL_TEXT AS '锁源当前执行的SQL语句' ,CURRENT_SCHEMA AS '数据库' FROM performance_schema.`events_statements_current` 
WHERE thread_id IN (SELECT THREAD_ID FROM performance_schema.threads pt WHERE processlist_id IN (SELECT blocking_pid FROM sys.innodb_lock_waits));

show full processlist;

参考

  • ​​MySQL备份导致的waiting for global read lock​​
  • ​​故障分析 | 全局读锁一直没有释放,发生了什么​​

 

特别声明:以上内容(图片及文字)均为互联网收集或者用户上传发布,本站仅提供信息存储服务!如有侵权或有涉及法律问题请联系我们。
举报
评论区(0)
按点赞数排序
用户头像
精选文章
thumb 中国研究员首次曝光美国国安局顶级后门—“方程式组织”
thumb 俄乌线上战争,网络攻击弥漫着数字硝烟
thumb 从网络安全角度了解俄罗斯入侵乌克兰的相关事件时间线