鸟山明 发表于 2023-3-15 13:53:47

MySQL 元数据锁等待时定位持锁SQL的方法

需求:

执行DDL发生元数据锁等待时需要定位持有锁的SQL
否则直接kill可能的连接时依然有风险

背景:

线上环境未开启 wait/lock/metadata/sql/mdl,因此无法通过 performance_schema.metadata_locks 数据表进行查询

这种情况下,如何快速定位持锁SQL?

个人理解:

1)information_schema.processlist 数据表查询同一张表的慢SQL,但是可能查不到SQL
2)information_schema.innodb_trx 数据表查询同一张表的未提交事务,但是可能查不到SQL
3)performance_schema.events_statements_current 数据表中查询SQL,但是可能查不到SQL
4)performance_schema.events_statements_history 数据表中查询SQL,但是可能查到多条SQL

请教下,有没有更好的办法可以快速定位持锁SQL?

yejr 发表于 2023-3-15 16:05:56

线上环境未开启 wait/lock/metadata/sql/mdl,因此无法通过 performance_schema.metadata_locks 数据表进行查询
====
5.7版本后可以在线动态开启,还是开起来吧,真不想用了,再关掉

鸟山明 发表于 2023-3-15 16:16:41

yejr 发表于 2023-3-15 16:05
线上环境未开启 wait/lock/metadata/sql/mdl,因此无法通过 performance_schema.metadata_locks 数据表进行 ...

领导老是让评估开启后的风险{:5_216:}

yejr 发表于 2023-3-16 18:18:51

鸟山明 发表于 2023-3-15 16:16
领导老是让评估开启后的风险

0风险,且有极大收益
真担心的话,可以阶段性开启,用完就关

lizibin 发表于 2023-3-20 17:18:50

如果开启了mdl instrument,sys有个视图可用
select * from sys.schema_table_lock_waits
持有锁、阻塞线程一目了然
页: [1]
查看完整版本: MySQL 元数据锁等待时定位持锁SQL的方法