云数据库 RDS-MDL锁视图:MDL锁视图案例分析
MDL锁视图案例分析
问题描述
用户发现对表t2执行truncate操作一直被阻塞后,业务流程中对表t2执行查询操作也全部被阻塞。
排查分析
- 无MDL锁视图
当发现DDL语句被阻塞后,执行show processlist查看线程信息,结果如下所示。
show processlist; +------+--------+--------------+--------+-----------+----------+-----------------------------------|-------------------------| | Id | User | Host | db | Command | Time | State |Info | +---------------+-----------------------+-----------+----------+-----------------------------------+-------------------------| | 2 | root | localhost | test | Sleep | 73 | | Null | | 3 | root | localhost | test | Sleep | 63 | | Null | | 4 | root | localhost | Null | Query | 35 | Waiting for table metadata lock | truncate table test.t2 | | 5 | root | localhost | test | Query | 17 | Waiting for table metadata lock | select * from test.t2 | | 6 | root | localhost | test | Query | 0 | starting | show processlist | +------+--------+--------------+--------+-----------+----------+-----------------------------------|-------------------------|
上述线程列表信息显示:
- ID=4的会话执行truncate操作时被其他会话持有的table metadata lock阻塞。
- ID=5的会话执行查询操作时同样被阻塞。
- 无法确定哪个会话阻塞了ID=4的会话和ID=5的会话。
此时,如果随机KILL其他会话会给线上业务带来很大风险,因此只能等待其他会话释放该MDL锁。
- 使用MDL锁视图
执行select * from information_schema.metadata_lock_info查看元数据锁信息,结果如下所示。
select * from information_schema.metadata_lock_info; +-------------+-------------+--------------------------+----------------------+-------------------+----------------+----------------+ | THREAD_ID | LOCK_STATUS | LOCK_MODE | LOCK_TYPE | LOCK_DURATION | TABLE_SCHEMA | TABLE_NAME | +-------------+-------------+--------------------------+----------------------+-------------------+----------------+----------------+ | 2 | GRANTED | MDL_SHARED_READ | Table metadata lock | MDL_TRANSACTION | test | t1 | | 3 | GRANTED | MDL_SHARED_READ | Table metadata lock | MDL_TRANSACTION | test | t2 | | 4 | GRANTED | MDL_INTENTION_EXCLUSIVE | Global read lock | MDL_STATEMENT | | | | 4 | GRANTED | MDL_INTENTION_EXCLUSIVE | Schema metadata lock | MDL_TRANSACTION | test | | | 4 | PENDING | MDL_EXCLUSIVE | Table metadata lock | | test | t2 | | 5 | PENDING | MDL_SHARED_READ | Table metadata lock | | test | t2 | +-------------+-------------+--------------------------+----------------------+-------------------+----------------+----------------+
结合show processlist的结果,从元数据锁视图中可以明显看出:
上述线程信息和元数据锁视图信息显示:
- THREAD_ID=4的会话正在等待表t2的metadata lock。
- THREAD_ID=3的会话持有表t2的metadata lock,该MDL锁为事务级别,因此只要THREAD_ID=3的会话的事务不提交,THREAD_ID=4的会话将会一直阻塞。
因此,用户只需在THREAD_ID=3的会话中执行命令commit或终止THREAD_ID=3的会话,便可以让业务继续运行。
- 华为云数据库 RDS for MySQL常见故障排除_华为云
- 免费的MySQL数据库_免费云数据库_MySQL数据库基础知识_MySQL数据库免费下载
- GaussDB监控_GaussDB数据库监控_高斯数据库监控_华为云
- GaussDB免费数据库_GaussDB哪家好_免费高斯数据库
- GaussDB分析_GaussDB数据库分析_高斯数据库分析_华为云
- mysql数据库免费吗_mysql在线数据库_mysql数据库下载
- GaussDB数据库入门_华为高斯数据库_新建高斯数据库_高斯语法_高斯数据库协议
- GaussDB数据库产品特性_华为gaussdb_高斯语法
- GaussDB数据库_金融级高安全_高斯数据库_华为云
- GaussDB了解_GaussDB入门_高斯数据库了解_华为云