Metadata Lock原理4
今天发生一个故障,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并发度

Metadata Lock原理4的更多相关文章
- Metadata Lock原理6
一 简介 上一篇文章 <MetaData Lock 之一> 简单的介绍了MySQL 引入MDL 的前因后果,本文深入了解MDL的实现原理和运行机制.二 MDL 的类型 meta ...
- Metadata Lock原理5
[MySQL] 之一2015-09-05 15:46:51 分类: MySQL 一 简介 和MySQL打交道比较多的朋友,肯定遇到过 "Waiting for table metadata ...
- Metadata Lock原理8
http://www.kancloud.cn/taobaomysql/monthly/67141 MySQL· 5.7优化·Metadata Lock子系统的优化 背景 引入MDL锁的目的,最初是为了 ...
- Metadata Lock原理7
http://blog.itpub.net/22664653/viewspace-1791744/ 一 简介 通过前面两篇文章的介绍,相信读到这里的各位对MDL 锁已经有了比较深入的了解了,本文将结合 ...
- Metadata Lock原理3
http://blog.itpub.net/26515977/viewspace-1208250/ 腾讯工程师 随着5.5.3引入MDL,更多的Query被“Waiting for table ...
- Metadata Lock原理2
同事说开发机更改一个表结构,加字段,但是一直挂在那里,没反应.一开始以为表测试数据量很大,因为mysql增加表字段会重写表,后来看了下数据量很小,就另外查看过程.原因分析和处理如下: 一.环境 m ...
- Metadata Lock原理1
https://www.percona.com/blog/2013/02/01/implications-of-metadata-locking-changes-in-mysql-5-5/ impli ...
- mysql metadata lock(三)
前言 MDL锁主要用来保护Mysql内部对象的元数据,通过MDL机制保证DDL与DML以及SELECT查询操作的并发.MySQL Meta Lock(一)和MySQL Meta Lock(二)已经讲了 ...
- mysql metadata lock(二)
上一篇<mysql metadata lock(一)>介绍了为什么引入MDL,MDL作用以及MDL锁导致阻塞的几种典型场景,文章的最后还留下了一个小小的疑问.本文将更详细的介绍MDL,主要 ...
随机推荐
- HDU 3695-Computer Virus on Planet Pandora(ac自动机)
题意: 给一个母串和多个模式串,求模式串在母串后翻转后的母串出现次数的的总和. 分析: 模板题 /*#include <cstdio> #include <cstring> # ...
- 微信web调试工具
做微信公众号开发的时候,最头疼的一件事,莫过于bug调试了. 由于有些功能涉及到权限问题,必须在微信公众号内打开,所以对开发人员来说就是遇到了一场噩梦. 这里有两种方法: 1.工具:mac.使用微信m ...
- <Araxis Merge>Windows平台下的Merge概览
它是什么 Merge是一个来自Araxis的可视化文件比较/合并及文件夹同步的应用程序. 用户界面使用英语.德语.日语.法语.国际西班牙语.汉语(繁体和简体)进行本地化了. 优势 对于软件工程师和网站 ...
- 2016-3-25突然推送大量消息的问题及查找 -- Sangit
起因:2016年3月25日 18:30 左右,突然接到客户投诉,说APP收到大量的任务推送消息,而且点击进去都是一些过期任务,我们将对此展开追踪,查找问题原因. 过程: 1.当时的第一反应是先查看re ...
- sqlserver 删掉日志文件ldf以后 救命语句
sqlserver 删掉日志文件ldf以后 救命步骤: 先新建一个新数据库, 删掉新建的 .mdb 用想要还原的mdb覆盖 执行下面的语句 ALTER DATABASE 'DB_Core' SET ...
- Standalone Django scripts
Standalone Django scripts DJANGO_SETTINGS_MODULE=foo.settings
- 第三百天了 how can I 坚持
郭娜还是不搭理我,或许是真没有遇到合适的.? 该咋办,好焦虑. 其实态度应该放低点,就这样是找不到对象的. 有必要这么死耗嘛,人生总是这么纠结. 周六年后,周日来吃火锅,这一年又过去了. 睡觉.
- source insight 支持CC 文件
今天开始阅读LevelDB的代码,用source insight建立工程,但其不支持cc后缀的C++文件. 找到这篇<source insight看cc文件> 解决的根本办法:Option ...
- POJ 1847 Tram (最短路)
Tram 题目链接: http://acm.hust.edu.cn/vjudge/contest/122685#problem/N Description Tram network in Zagreb ...
- Spring Auto scanning components
Normally you declare all the beans or components in XML bean configuration file, so that Spring cont ...