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

在MySQL中,未提交的DML事务执行DDL操作会导致Metadata Lock,影响其他查询和操作。问题复现显示,在DML事务未结束时执行`CREATE TABLE IF NOT EXISTS`会使表被锁定,阻止SELECT查询。解决方案包括修改Dnsmasq计算脚本,避免使用`CREATE TABLE IF NOT EXISTS`,检查并提交或回滚未完成的事务,以及预先创建结果表。同时,优化报表订阅程序为多线程消费队列,并增强日志监控。
摘要由CSDN通过智能技术生成

问题描述

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查询也无法操作. 以下是问题复现.

image2017-3-31+20%3A57%3A17.png?version=1&modificationDate=1490965037000

image2017-3-31+21%3A14%3A22.png?version=1&modificationDate=1490966062000

问题复现

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

Connection1

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 发现该表已经被锁.

Connection2:

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

... 执行block ...

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

Connection3:

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、优化报表监控日志,增加消费时间,处理状态等信息

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值