http://blog.chinaunix.net/uid-28212952-id-3400571.html    Alibaba 

今天发生一个故障,MM复制结构(主备库),备库slave delay越来越大,造成在备库上的读与主库数据不一致,登上备库分析:

1.show processlist

drop table tmp_table 在  Waiting for table metadata lock

2.ps

mysqldump 在备份整个实例数据

kill了备份进程,drop table tmp_table执行成功,slave delay逐步减少

疑问:

1.metadata lock是什么东西

2.mysqldump中什么操作hold table metadata lock,hold范围是单表还是实例上全部表

mysqldump原理:

1.FLUSH TABLES

2.FLUSH TABLES WITH READ LOCK

  • sets the global read lock
  • closes open tables
  • sets a flag to block commits

3.SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;

4.start transaction

5.记录log pos

6.unlock tables

7.select * from ...

8.commit

测试(5.5.18):

Time

sessionA

sessionB

1

Set auto_commit=0;

Set auto_commit=0;

2

create table tmp1(a int);

3

create table tmp2(a int);

4

create table tmp3(a int);

5

FLUSH TABLES WITH READ LOCK;

6

start transaction;

7

unlock tables;

8

insert into tmp1 value(1); (执行成功)

9

drop table tmp1;(执行成功)

10

Select * from tmp1;(表不存在)

11

Select * from tmp2;

12

insert into tmp2 value(1); (执行成功)

13

drop table tmp2; (Waiting for table metadata lock)

14

Kill drop table tmp2;

15

Select * from tmp3;

16

drop table tmp2; (Waiting for table metadata lock)

17

commit;

18

drop table tmp2; (执行成功)

  • DML操作在备份期间是不会被block(time 8)
  • DDL操作在备份进程未获取某个table的meta data lock时,并发的DDL语句是可以执行的(time 9)
  • DDL是不遵循MVCC的,session2执行DDL后,session1受到影响,一致性被破坏(time 10)
  • Select tmp2获取table tmp2的table meta data lock,导致session2无法执行DDL,保证一致性(time 13)
  • Mysqldump备份过程逐一获取table meta data lock,但是不是逐一释放,而是等到备份结束时统一释放 (time 16)

测试(5.1.48):

由于5.1中没有引入meta data lock,所有在mysqldump备份过程中,并发session都可以执行DDL,导致备份集不一致,最终表现是使用此备份集恢复的备库在relay主库binlog会出现slave error,如DML找不到表,DDL重复操作等问题,之前一直以为是备份中断导致备份集不完整,现在终于找到原因了

思考:

虽然5.5中引入了meta data lock,但是仍然无法完全解决并发DDL对备份的影响:

  • 5.1中由于没有引入meta data lock,在备份整个过程中并发DDL都会对其产生影响
  • 5.5中引入meta data lock后,只是保证针对已经备份表的DDL会被block,只是降低了并发DDL影响的概率,解决方式是在start transaction与unlock tables之间获取实例上全部表的meta data lock,但是当表数量很大时,这个操作可以很耗时,而这个过程由于处于FLUSH TABLES WITH READ LOCK下,所以DML会被block,也许是因为DML执行频率远大于DDL操作,所以mysqldump选择了最大DML并发度
附上:mysqldump执行流程

 

Metadata Lock原理4的更多相关文章

  1. Metadata Lock原理6

      一 简介   上一篇文章 <MetaData Lock 之一>  简单的介绍了MySQL 引入MDL 的前因后果,本文深入了解MDL的实现原理和运行机制.二 MDL 的类型  meta ...

  2. Metadata Lock原理5

    [MySQL] 之一2015-09-05 15:46:51 分类: MySQL 一 简介 和MySQL打交道比较多的朋友,肯定遇到过 "Waiting for table metadata ...

  3. Metadata Lock原理8

    http://www.kancloud.cn/taobaomysql/monthly/67141 MySQL· 5.7优化·Metadata Lock子系统的优化 背景 引入MDL锁的目的,最初是为了 ...

  4. Metadata Lock原理7

    http://blog.itpub.net/22664653/viewspace-1791744/ 一 简介 通过前面两篇文章的介绍,相信读到这里的各位对MDL 锁已经有了比较深入的了解了,本文将结合 ...

  5. Metadata Lock原理3

      http://blog.itpub.net/26515977/viewspace-1208250/   腾讯工程师 随着5.5.3引入MDL,更多的Query被“Waiting for table ...

  6. Metadata Lock原理2

    同事说开发机更改一个表结构,加字段,但是一直挂在那里,没反应.一开始以为表测试数据量很大,因为mysql增加表字段会重写表,后来看了下数据量很小,就另外查看过程.原因分析和处理如下:  一.环境  m ...

  7. Metadata Lock原理1

    https://www.percona.com/blog/2013/02/01/implications-of-metadata-locking-changes-in-mysql-5-5/ impli ...

  8. mysql metadata lock(三)

    前言 MDL锁主要用来保护Mysql内部对象的元数据,通过MDL机制保证DDL与DML以及SELECT查询操作的并发.MySQL Meta Lock(一)和MySQL Meta Lock(二)已经讲了 ...

  9. mysql metadata lock(二)

    上一篇<mysql metadata lock(一)>介绍了为什么引入MDL,MDL作用以及MDL锁导致阻塞的几种典型场景,文章的最后还留下了一个小小的疑问.本文将更详细的介绍MDL,主要 ...

随机推荐

  1. Webdriver API (三)- actions

    Actions类主要定义了一些模拟用户的鼠标mouse,键盘keyboard操作.对于这些操作,使用perform()方法进行执行. actions类可以完成单一的操作,也可以完成几个操作的组合. 有 ...

  2. 中断——中断处理程序的进入与退出 (基于3.16-rc4)

    上一篇博文我们分析了中断描述符表的中断门初始化过程,并且在interrupt数组中初始化过程中,可以看到每个中断处理程序都会跳入common_interrupt中.下面我们分析下common_inte ...

  3. MySQL数据库备份和还原

    备份MySQL数据库的命令 mysqldump -hhostname -uusername -ppassword databasename > backupfile.sql 备份MySQL数据库 ...

  4. InputFormat,OutputFormat,InputSplit,RecordRead(一些常见面试题),使用yum安装64位Mysql

    列举出hadoop常用的一些InputFormat InputFormat是用来对我们的输入数据进行格式化的.TextInputFormat是默认的. InputFormat有哪些类型? DBInpu ...

  5. Spark系列(十)TaskSchedule工作原理

    工作原理图 源码分析: 1.) 25              launchedTask = true 26            } 27          } catch { 28         ...

  6. angularJS笔记

    1.MVC ng-app: html表头处,每个htnl文件只能有一个ng-app ng-controller :js文件中定义 ng-model:只要引用了angularJS就可以使用 js文件代码 ...

  7. 第二百五十八天 how can I 坚持

    装虚拟机了.CentOs,32位,这电脑装4台能不能带起来啊. 早上,流鼻血了,不知道咋回事.太干了... 明天得早起会,得利索着点,不能托托拉拉的. 还有,今天又忘带钥匙了.悲剧. 睡觉.hadoo ...

  8. DAG的生成

    DAG的生成 原始的RDD(s)通过一系列转换就形成了DAG.RDD之间的依赖关系,包含了RDD由哪些Parent RDD(s)转换而来和它依赖parent RDD(s)的哪些Partitions,是 ...

  9. 自定义控件和XControl控件

    (1)LabVIEW的自定义控件,实际上就是对LabVIEW自带的控件的一种修改,但是这种修改只能改变它的外观,即大小.颜色.位置等等,但是功能是改变不了的.如你对一个按钮进行自定义控件,无论怎么改, ...

  10. codeforces 624B Making a String

    Making a String time limit per test 1 second memory limit per test 256 megabytes input standard inpu ...