文档章节

Mysql DML操作事务未提交情况下进行DDL操作会造成Meatadata 锁

郭恩洲_OSC博客
 郭恩洲_OSC博客
发布于 2017/04/01 10:50
字数 584
阅读 63
收藏 0

 

问题描述

     3月29日至3月30日早上8点,报表订阅发送队列阻塞,造成大量业务报表没有及时发送事后分析发现执行Dnsmasq报表任务时间过长,造成队列消费者worker程序block(由于每天报表任务不多<100,固采用单线程wroker执行) 我们具体查看了计算结果表mc_stat_dnsmasq 和这个时段指标历史数据,发现metadata lock表锁(图1). dnsmasq表被锁造成报表订阅程序无法正常select查询该表数据(29号被锁是在05:00-10:00, 30号是05:00–09:00 ,其中9点是将执行中计算脚本kill掉),.  我们继续对Dnsmasq计算分析脚本代码(见附件)逐层进行分析mc_stat_dnsmasq  为什么会 被锁表情况. 通过问题复现发现在其它会话DML操作没提交事务情况下执行了create table if not exists造成Metadata lock,这种情况锁表select查询也无法操作. 以下是问题复现.

问题复现

连接会话1 做DML操作没有提交事物;

Connection 1

mysql> create table mc_stat_dnsmasq_test(ip varchar(100));

Query OK, 0 rows affected (0.01 sec)

mysql> start transaction;

Query OK, 0 rows affected (0.00 sec)

mysql> insert into mc_stat_dnsmasq_test values('127.0.0.1');

Query OK, 1 row affected (0.00 sec)

mysql>

连接会话2: 执行 create table if not exit 语句操作,被block了, show processlist 发现该表已经被锁.

Connection 2:

 

mysql> create table if not exists mc_stat_dnsmasq_test(ip varchar(100));

 

... 执行block ...

连接会话3:  执行查询语句无法进行操作

Connection 3:

 

mysql> select * from mc_stat_dnsmasq;

 

... 执行block ...

处理办法

Dmsmasq计算脚本处理办法:

1.程序代码逻辑做规避,采用select from mc_stat_dnsmasq判断,如果表已经存在,就不执行create table. 放弃使用create table if not exists

2. 查找程序中DML操作,开启事务,未提交事务代码;

3.后期对计算分析结果表不采用程序判断自动创建结果表,采用预先创建 

对报表订阅优化:

1、调整消费者执行策略多线程的方式对队列进行消费;

 2、优化报表监控日志,增加消费时间,处理状态等信息

 

© 著作权归作者所有

郭恩洲_OSC博客
粉丝 37
博文 256
码字总数 118046
作品 0
徐汇
高级程序员
私信 提问
MySQL出现Waiting for table metadata lock的原因以及解决方法

MySQL在进行alter table等DDL操作时,有时会出现Waiting for table metadata lock的等待场景。而且,一旦alter table TableA的操作停滞在Waiting for table metadata lock的状态,后续对Tab...

雪隐千寻
2017/12/06
0
0
MySQL · 特性分析 · 利用gdb跟踪MDL加锁过程

MDL(Meta Data LocK)的作用 在MySQL5.1及之前的版本中,如果有未提交的事务trx,当执行DROP/RENAME/ALTER TABLE RENAME操作时,不会被其他事务阻塞住。这会导致如下问题(MySQL bug#989) mas...

阿里云RDS-数据库内核组
2017/09/07
0
0
【MySQL经典案例分析】 Waiting for table metadata lock

在这篇文章中: 一、 问题是这样来的 二、 苦逼的探索过程 三、 延伸的一些思考 一、 问题是这样来的 2018年某个周末,接到连续数据库的告警,告警信息如下: 二、 苦逼的探索过程 1、总体的...

刘迪
2018/12/06
0
0
【20180613】MySQL innodb 引擎如何解决幻读

MySQL innodb 引擎如何解决幻度 MySQL innodb 引擎事务的隔离级别有四种,默认是可重复读(REPEATABLE READ) 未提交读(READ UNCOMMITTED)。俩个不同session,一个session正在显式的开启事务进...

liuhuang9496
2018/06/13
0
0
【mysql】不可不知的Metadata Lock

一、问题发生 说一个现象,当收到服务器报警之后,数据库服务器CPU使用超过90%,通过 一看,满屏都是 状态的连接。第一反应就是kill掉这些连接,奈何连接实在太多,实在kill不过来,于是重启...

踏雪无痕SS
2018/09/20
0
0

没有更多内容

加载失败,请刷新页面

加载更多

golang-字符串-地址分析

demo package mainimport "fmt"func main() {str := "map.baidu.com"fmt.Println(&str, str)str = str[0:5]fmt.Println(&str, str)str = "abc"fmt.Println(&s......

李琼涛
今天
4
0
Spring Boot WebFlux 增删改查完整实战 demo

03:WebFlux Web CRUD 实践 前言 上一篇基于功能性端点去创建一个简单服务,实现了 Hello 。这一篇用 Spring Boot WebFlux 的注解控制层技术创建一个 CRUD WebFlux 应用,让开发更方便。这里...

泥瓦匠BYSocket
今天
6
0
从0开始学FreeRTOS-(列表与列表项)-3

FreeRTOS列表&列表项的源码解读 第一次看列表与列表项的时候,感觉很像是链表,虽然我自己的链表也不太会,但是就是感觉很像。 在FreeRTOS中,列表与列表项使用得非常多,是FreeRTOS的一个数...

杰杰1号
今天
8
0
Java反射

Java 反射 反射是框架设计的灵魂(使用的前提条件:必须先得到代表的字节码的 Class,Class 类 用于表示.class 文件(字节码)) 一、反射的概述 定义:JAVA 反射机制是在运行状态中,对于任...

zzz1122334
今天
5
0
聊聊nacos的LocalConfigInfoProcessor

序 本文主要研究一下nacos的LocalConfigInfoProcessor LocalConfigInfoProcessor nacos-1.1.3/client/src/main/java/com/alibaba/nacos/client/config/impl/LocalConfigInfoProcessor.java p......

go4it
昨天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部