mysql 找出谁持有全局读锁

数据库版本 5.7.17-log
开始三个会话

会话1

-- 全局读锁
FLUSH TABLE WITH READ LOCK;

-- 查询当前会话id  等同于 show processlist 结果的id
SELECT CONNECTION_ID();

-- 释放锁
UNLOCK TABLES;

会话2

SELECT CONNECTION_ID();
SELECT * FROM sales WHERE id = 1;

-- 会被阻塞
UPDATE sales SET DATE = NOW() WHERE id = 1;

会话3

SELECT * FROM information_schema.innodb_locks;

SELECT * FROM information_schema.innodb_lock_waits;

SELECT * FROM information_schema.innodb_trx;

SHOW ENGINE INNODB STATUS;
-- 上面均没有锁信息
-- 可以看到 id=会话2 对应的CONNECTION_ID(),state=Waiting for global read lock,表示正在等待全局读锁
SHOW  PROCESSLIST;
SHOW PROCESSLIST 结果
-- 通过metadata_locks表里排查谁持有全局读锁,全局读锁在该表中同城记录着同一个会话的OBJECT_TYPE为global和commit,LOCK_TYPE都为SHARED
SELECT * FROM performance_schema.`metadata_locks`  WHERE owner_thread_id != sys.ps_thread_id(CONNECTION_ID());
metadata_locks 查询结果

metadata_locks为空解决办法

-- 如果metadata_locks记录为空,则需手动开启对应监控
SELECT * FROM  performance_schema.setup_instruments WHERE NAME = 'wait/lock/metadata/sql/mdl';

UPDATE  performance_schema.setup_instruments SET enabled = 'YES' ,timed='YES' WHERE NAME = 'wait/lock/metadata/sql/mdl';

sys.ps_thread_id

SHOW CREATE FUNCTION sys.ps_thread_id; 查看具体的定义

SHOW CREATE FUNCTION sys.ps_thread_id; 

-- 函数核心内容
SELECT THREAD_ID FROM `performance_schema`.`threads` WHERE PROCESSLIST_ID = IFNULL(入参, CONNECTION_ID());

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 主要来自 《高性能MySQL(第3版)》 《MySQL管理之道:性能调优、高可用与监控(第2版)》 《MyS...
    FengXQ阅读 590评论 0 0
  • 一、MySQL介绍 二、MySQL 安装 1.安装前注意事项 (1)确认SELinux 和 系统防火墙 iptab...
    L_Jing_b48d阅读 290评论 0 0
  • MySQL8.0新功能列表 There are over 250 new features inMySQL8.0....
    cccolors阅读 524评论 0 0
  • MySQL全面优化1.优化哲学1.1 为什么优化?为了获得成就感?为了证实比系统设计者更懂数据库?为了从优化成果来...
    5不忘初心0阅读 358评论 0 0
  • 摘要 InnoDB 行级锁排查 MDL 元数据锁排查 死锁排查 InnoDB ‘行级锁’排查 当反馈有锁等待产生时...
    雨中中人阅读 331评论 0 0