首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >waiting for metadata lock对腾讯云从节点的影响及处理

waiting for metadata lock对腾讯云从节点的影响及处理

原创
作者头像
vkyzhao
修改于 2020-12-21 03:29:40
修改于 2020-12-21 03:29:40
1.3K00
代码可运行
举报
运行总次数:0
代码可运行

背景

案例一、

某用户A反馈CDB实例读业务数据库没有响应,在控制台界面看到ro节点被剔除,剔除之前数据库监控上面cpu负载正常,活跃线程数出现大量的堆积;提单后,平台紧急介入,观察到ro节点出现大量的waiting for table metadata lock的报错。

案例二、

某用户B反馈TDSQL实例部分读账户无法正常访问从节点了;提单后,观察到主从之间的延迟甚至达到了3000s,tdsql为保证从节点读到数据和主节点数据一致性,拒绝从节点继续服务。同时通过观察,发现从节点上面出现大量的waiting for table metadata lock的报错。

分析

对于mysql族的数据库,出现waiting for table metadata lock的报错,我们都可以套用一套经典的故障场景,即

session1

session2

session3

T1

A表相关大事务

T2

申请A表原子写锁操作线程处于waiting metadata lock

T3

A表相关查询线程处于waiting metadata lock

表格1

通过这个图我们观察到,要出现该报错,需要具备的条件 (1)、首先实例特定表上面存在未提交的大事务 (2)、其次实例该表接受到获取原子写锁的操作,常见的包括FTWRL和ddl操作(包括drop、truncate、alter、rename等等修改表结构的操作) (3)、最后,我们需要在该表上面进行任意的dml操作

检查故障时间点的会话情况,我们确实都看到了相对应的线程,可以确认由于实例踩中了这个场景,导致实例出现会话线程飙升。

回到文章前面的问题本身: 对于案例一、我们了解到用户在故障之前启用了dts订阅,然而dts订阅会有获取binlog位点的操作,该操作需要执行flush table with read lock,也即是FTWRL操作。该操作会有mdl申请写锁的步骤,在主节点上面,dts订阅会检查主节点上面是否存在该表的未提交大事务(也就是(1)中的条件),保证ddl语句能够正常进行,但是该操作随着mysql复制到达ro节点上面进行重放,重放过程中,不巧碰到ro节点上面存在该表的大事务,后续业务和该表相关的dml语句也都hang住,同时由于flush table with read lock没有能正常执行完成,复制的sql线程hang住,延迟增加到剔除阈值,导致ro节点被剔除。整个流程如图1。

图1
图1

对于案例二、我们在用户从节点的线程中观察到存在执行时间超过8ws的大事务,同时也观察到存在alter该表的语句,可以确定也踩中了该场景,经过确认,用户之前在主节点进行了alter操作,该操作跟随mariadb复制传送到从节点,从节点上面存在该表的大事务长期占用mdl读锁,导致sql线程无法正常进行。主从延迟超过10s后,系统拒绝从节点继续提供服务,部分无法访问从节点就报错的业务返回错误,所幸另外一部分设置为从节点访问报错继续访问主节点的业务还能勉强为业务提供服务。整个流程如图2。

图2
图2

拓展

我们上面聊到,只要满足表格1中的情况,就会导致出现原子表锁等待,继而导致大量的线程产生。那么在TDSQL和cdb实际的情况是怎样的呢。这里先介绍一个参数:lock_wait_timeout

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
lock_wait_timeout

Command-Line Format	--lock-wait-timeout=#
System Variable	lock_wait_timeout
Scope	Global, Session
Dynamic	Yes
Type	Integer
Default Value	31536000
Minimum Value	1
Maximum Value	31536000

This variable specifies the timeout in seconds for attempts to acquire metadata locks. The permissible values range from 1 to 31536000 (1 year). The default is 31536000.

https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html

根据官档的定义,该参数决定了等待元数据锁超时的时间。默认值为31536000,也就是一年。在TDSQL当中,该值默认值被设为5s,对于主节点上面,如果产生表格1中的场景,申请元数据锁的操作将会在等待5s即抛出超时异常同时释放原子写锁,保证其它的线程能够正常运行。如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mysql> alter table a force;
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction

那为什么在我们这篇文档的开头仍然出现了该情况呢?

这是由于我们的大事务在从节目持有原子读锁,而申请原子写锁的事物,是在relay log当中,重放过程中并没有受到这个参数的影响。导致从节点其它事物出现大量的原子读锁等待,复制线程也被hang住。

而cdb的lock_wait_timeout默认值沿用了mysql的缺省值,为一年,不过在这个案例里面也出现在了从节点。理论上在主节点也会出现该种场景。

那么为什么需要元数据锁呢?

设想一个场景:

session1

session2

T1

mysql> begin; mysql> insert into tb_a a;

T2

mysql> begin; mysql> drop table tb_a; mysql> commit;

T3

mysql> commit;

表格2

我们知道,在存在元数据锁的情况下,session 2在session 1提交之前,一直会处于hang住的状态。假设不存在元数据锁了,这两个事务得到了正常的提交。那么会产生一个现象,在binlog当中的,insert的操作被记录到了drop操作之后,sql执行序列发生了改变。当然,对于实例本身,这里不会产生影响。

但是如果使用全量数据+binlog增量数据作为备份呢?这里在回档过程中,明显会出现增量binlog无法重放的现象。导致了我们备份数据无效的数据安全场景。不仅仅是备份,在使用mysql复制作为从节点的方案里面,这里也会直接导致主从复制出现中断。因此,mysql在 5.5.3版本之后引入了元数据锁来保证数据备份的可靠性。

除开mysql表的元数据锁,也引进了schemas, stored programs (procedures, functions, triggers, scheduled events), tablespaces 相关的元数据锁。

参考文档

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Metadata Lock Release
To ensure transaction serializability, the server must not permit one session to perform a data definition language (DDL) statement on a table that is used in an uncompleted explicitly or implicitly started transaction in another session. The server achieves this by acquiring metadata locks on tables used within a transaction and deferring release of those locks until the transaction ends. A metadata lock on a table prevents changes to the table's structure. This locking approach has the implication that a table that is being used by a transaction within one session cannot be used in DDL statements by other sessions until the transaction ends.

https://dev.mysql.com/doc/refman/5.7/en/metadata-locking.html

规避

1、数据库变更(ddl)需要放在业务低谷,保证对业务的影响最低

2、ddl变更之前除了需要观察主节点是否存在未提交的大事务外,还需要关注从节点是否存在未提交的大事务,如果存在大事务,可以先将大事务kill掉。如图3。

图3
图3

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【MySQL经典案例分析】 Waiting for table metadata lock
2018年某个周末,接到连续数据库的告警,看到too many connection的报错信息,基本上可以把问题定位在...
迪B哥
2018/12/06
4.3K0
遇到MDL锁,如何分析和处理?
之前遇到一个DBA,在生产库上加字段,导致数据库连接数打满。原因就是MDL锁引起。下面让我来介绍一下MDL锁及其排查和处理方式。
用户10842762
2023/11/15
6901
技术分享 | MySQL 的 MDL 锁解惑
网名 bisal ,具有十年以上的应用运维工作经验,目前主要从事数据库应用研发能力提升和技术管理相关的工作,Oracle ACE ,腾讯云TVP,拥有 Oracle OCM & OCP 、EXIN DevOps Master 、SCJP 等国际认证,国内首批 Oracle YEP 成员,OCMU 成员,《DevOps 最佳实践》中文译者之一,CSDN & ITPub 专家博主,公众号"bisal的个人杂货铺",长期坚持分享技术文章,多次在线上和线下分享技术主题。
爱可生开源社区
2022/05/23
1.2K0
技术分享 | MySQL 的 MDL 锁解惑
MySQL 5.7:如何有效规避 MDL 元数据锁阻塞?
在 MySQL 5.7 中,元数据锁(MDL, Metadata Lock) 机制用于确保数据一致性,但如果处理不当,可能会导致长时间阻塞,影响数据库的并发性能。
贺春旸的技术博客
2025/02/17
1730
Waiting for table metadata lock问题处理
在使用mysql的时候,我们有时会碰到Waiting for table metadata lock的锁等待。但是这个锁等待比较特殊,在innodb_lock_wait和show engine innodb status 表里面都查不到。
老叶茶馆
2020/06/24
1.7K0
alter table锁表,MySQL出现Waiting for table metadata lock的场景浅析及解决方案
在修改/增加表字段的时候,发现很慢, show processlist; 时, Waiting for table metadata lock 能一直锁很久。 官网的一段话,可以理解下 http://dev.mysql.com/doc/refman/5.5/en/metadata-locking.html 8.10.4. Metadata Locking MySQL 5.5.3 and up uses metadata locking to manage access to objects (tables,
小小科
2018/05/03
3.3K0
alter table锁表,MySQL出现Waiting for table metadata lock的场景浅析及解决方案
mysqldump与innobackupex备份过程你知多少(完结篇)
相关阅读: mysqldump与innobackupex备份过程你知多少(三) mysqldump与innobackupex备份过程你知多少(二) mysqldump与innobackupex备份过程
沃趣科技
2018/03/26
1.9K0
mysqldump与innobackupex备份过程你知多少(完结篇)
突发状况,数据库表被锁,抓瞎了?
在程序员的职业生涯中,总会遇到数据库表被锁的情况,前些天就又撞见一次。由于业务突发需求,各个部门都在批量操作、导出数据,而数据库又未做读写分离,结果就是:数据库的某张表被锁了!
程序新视界
2022/05/13
1.3K0
waiting for table metadata lock的一种解决方法
对MySQL进行alter table等DDL操作时,有时会发现对某个表的任何操作都被阻塞,包括读,报错如下图所示
于航
2019/08/10
10.1K0
MetaData Lock 之一
一 简介 和MySQL打交道比较多的朋友,肯定遇到过 "Waiting for table metadata lock"或者由于MDL导致的故障,不过本文介绍MDL锁之前 我们先看一个著名的bug#989 大致情况如下: s1:
用户1278550
2018/08/09
4510
聊聊 MySQL 的 Online DDL
日常开发我们对一条DML语句较为熟悉,很多开发人员都了解sql的执行过程,比较熟悉,但是DDL是如何执行的呢,大部分开发人员可能不太关心,也认为没必要了解,都交给DBA吧。其实不然,了解一些能尽量避开一些ddl的坑,那么下面带大家一起了解一下DDL执行的方式,也算抛砖引玉吧。如有错误,还请各位大佬们指正。
码猿技术专栏
2023/09/07
1.2K0
聊聊 MySQL 的 Online DDL
MySQL在并发场景下的优化手段
对于数据库系统来说在多用户并发条件下提高并发性的同时又要保证数据的一致性一直是数据库系统追求的目标,既要满足大量并发访问的需求又必须保证在此条件下数据的安全,为了满足这一目标大多数数据库通过锁和事务机制来实现,MySQL数据库也不例外。尽管如此我们仍然会在业务开发过程中遇到各种各样的疑难问题,本文将以案例的方式演示常见的并发问题并分析解决思路。
Bug开发工程师
2018/07/23
1.2K0
MySQL在并发场景下的优化手段
MySQL表结构变更,不可不知的Metadata Lock
在线上进行DDL操作时,相对于其可能带来的系统负载,其实,我们最担心的还是MDL其可能导致的阻塞问题。
星哥玩云
2022/08/17
4380
MySQL表结构变更,不可不知的Metadata Lock
MySQL全面优化思路-基础内容
通过 top -Hp 10380 指定占用高的进程,可以看到具体是那些线程占用过高
Yuou
2022/09/26
4370
MySQL 实战笔记 第02期:MySQL 元数据锁
当我们在 MySQL 中执行 DDL 语句时,经常会发现语句没有在你预期的时间完成,这时候我们通常会使用 show full processlist ,来看看发生了什么状况。当你看到 waiting for table metadata lock 时,那就碰到元数据锁了。那元数据锁是怎样产生的又应该怎样避免呢?让我们从这篇文章开始了解它。
jeanron100
2020/12/31
2K0
生产运维脚本引发的 MDL 锁故障排查之旅
作者:何文超,分享 MySQL 和 OceanBase 相关技术博文。 个人博客【CSDN | 雅俗数据库】
爱可生开源社区
2025/05/21
1160
生产运维脚本引发的 MDL 锁故障排查之旅
MySQL metadata lock 的A来B去
A: 为了确保事务的可串行性,服务器必须不允许一个会话对另一个会话中未完成的显式或隐式启动的事务中使用的表执行数据定义语言(DDL)语句。服务器通过在事务中使用的表上获取元数据锁,并将这些锁的释放推迟到事务结束时,从而实现这一点。表上的元数据锁可以防止对表结构的更改。这种锁定方法意味着一个会话内的事务正在使用的表不能进行DDL 的操作,表上的元数据锁可以防止对表结构的更改。这种锁定方法意味着,一个会话内的事务正在使用的表不能在DDL语句中被其他会话使用,直到事务结束。”
AustinDatabases
2019/09/18
8220
MySQL metadata lock  的A来B去
深入理解MDL元数据锁
当你在MySQL中执行一条SQL时,语句并没有在你预期的时间内执行完成,这时候我们通常会登陆到MySQL数据库上查看是不是出了什么问题,通常会使用的一个命令就是 show processlist,看看有哪些session,这些session在做什么事情。当你看到 waiting for table metadata lock 时,那就是遇到MDL元数据锁了。本篇文章将会介绍MDL锁的产生与排查过程。
MySQL技术
2019/12/12
3.2K0
Mysql一分钟定位 Next-Key Lock,你需要几分钟
查看线程模型 show variables like 'thread_handling'
王清培
2020/01/27
4300
MySQL5.7+查看Waiting for table metadata lock 锁情况
Waiting for table metadata lock 这个mdl锁,我们最常见,这篇先拿它开刀。
保持热爱奔赴山海
2020/07/27
3.7K0
MySQL5.7+查看Waiting for table metadata lock  锁情况
相关推荐
【MySQL经典案例分析】 Waiting for table metadata lock
更多 >
LV.0
这个人很懒,什么都没有留下~
交个朋友
加入[数据] 腾讯云技术交流站
获取数据实战干货 共享技术经验心得
加入数据技术工作实战群
获取实战干货 交流技术经验
加入[数据库] 腾讯云官方技术交流站
数据库问题秒解答 分享实践经验
换一批
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档