MySQL查询等待表元数据锁始终不超时的原因排查
为什么InnoDB表的SELECT查询等待元数据锁时不超时?
你遇到的问题核心是锁类型与对应超时参数不匹配:
innodb_lock_wait_timeout仅控制InnoDB行级锁的等待超时时间,对你当前遇到的**表元数据锁(MDL)**完全无效。- 控制MDL锁等待超时的是全局参数
lock_wait_timeout,MySQL 8.0默认值为31536000秒(约1年),这就是你的SELECT查询会无限挂起的原因。
补充说明:
lock tables my_table write;会获取该表的MDL写锁,而select count(*) from my_table;需要获取MDL读锁。MDL锁的规则是写锁会阻塞所有后续读锁请求,因此后者会进入等待状态。- 若要修改MDL锁的等待超时时间,可执行:
注意:修改全局参数后需重新连接客户端才会生效,若要永久生效需在set global lock_wait_timeout = 5;my.cnf(或my.ini)中添加配置:lock_wait_timeout = 5
内容的提问来源于stack exchange,提问作者mgiuffrida
相关产品推荐
相关产品推荐

