MySQL ddl丢表
MySQL ddl丢表:
MySQL server层为了和innodb层保持数据一致性,在写binlog和redo log时,引入了两阶段提交,但不同的变更产生的日志并非都使用这种策略。
下面就来看看ddl语句产生的binlog日志写入交互过程,从源码的角度理解大家熟知的MySQL ddl丢表。
测试:
create table mm(id int primary key, name varchar(100));
注意:测试在MySQL的5.5.18版本。因为dll语句默认提交,所以环境变量autocommit,tx_isolation不影响。
步骤:
1. 解析SQL语句
HA_CREATE_INFO create_info(lex->create_info);
Alter_info alter_info(lex->alter_info, thd->mem_root);
生成ddl语句需要的数据结构。
注意:在这个过程中,ddl语句进行了隐式提交
if (trans_commit_implicit(thd)): 隐式提交
thd->mdl_context.release_transactional_locks(); 释放mdl锁
2. innodb创建表
函数:mysql_create_table_no_lock:
调用innodb引擎的创建表结构,具体步骤此次省略,我们的重点主要是binlog写入的交互
3. server写入binlog
1. 生成binlog日志
write_bin_log
THD::binlog_query
Query_log_event qinfo(this, query_arg, query_len, is_trans, direct,suppress_use, errcode);
ddl产生的mysql binlog event的类型是Query_log_event
2. 写入binlog cache
file= &log_file; 使用mysql_bin_log全局的IO_CACHE.
mysql_mutex_lock(&LOCK_log)
event_info->write(file)
Query_log_event::write
根据event的内容,按照小端字节法,写入buff内存中,然后flush到mysql_bin_log对应的io_cache中。
3. 同步日志
binlog写入完成后,使用flush_and_sync,持久化到binlog文件中,最后释放lock_log.
mysql_file_sync
mysql_mutex_unlock(&LOCK_log);
最后的结果是:

mysql> show binlog events in 'binlog.000013'; +---------------+-----+-------------+-----------+-------------+------------------------------------------------------------------------+
| Log_name | Pos | Event_type | Server_id | End_log_pos | Info |
+---------------+-----+-------------+-----------+-------------+------------------------------------------------------------------------+
| binlog.000013 | 4 | Format_desc | 100 | 107 | Server ver: 5.5.18.....................................................|
| binlog.000013 | 107 | Query | 100 | 228 | use `xpchild`; create table mm(id int primary key , name varchar(100)) |

了解了上面的函数调用过程,下面我们模拟一下丢表的情形:
在第二步结束后,kill mysqld模拟mysql crash的情形,然后重启,就会看到:
show tables:显示存在表 mm
show binlog:没有create table mm的query event出现。
这样,主库和备库就在不一致的状态。
思考:为什么ddl不使用事务性语句的binlog写入策略?因为ddl默认不需要commit,无法介入到两阶段?
后记:除了ddl产生的不一致的问题,MySQL的字典表,因为没有使用事务引擎来存储,也会出现数据不一致的情况。
不过,最近有消息传MySQL有意使用innodb引擎来保存字典表。
MySQL ddl丢表的更多相关文章
- mysql DDL 锁表
mysql DDL 锁表 select trx_state, trx_started, trx_mysql_thread_id, trx_query from information_schema.i ...
- mysql删除大表更快的drop table办法
mysql删除大表更快的drop table办法 参考资料:https://blog.csdn.net/anzhen0429/article/details/76284320 利用硬链接和trunca ...
- MySQL数据库以及表的管理
MySQL数据库以及表的管理 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 今天我们探讨的话题就是如何使用MySQL做开发,我们运维的主要工作不是去开发SQL的,但尽管如此,我们有 ...
- Mysql的建表规范与注意事项
一. 表设计规范 库名.表名.字段名必须使用小写字母,“_”分割. 库名.表名.字段名必须不超过12个字符. 库名.表名.字段名见名知意,建议使用名词而不是动词. 建议使用InnoDB存储引擎. 存储 ...
- mysql中大数据表alter增加字段报错:"1034 Incorrect key file for table 'table_name'; try to repair it"
mysql中大数据表alter增加字段报错:"1034 Incorrect key file for table 'table_name'; try to repair it" 现 ...
- MySQL DDL详情揭露
前言: MySQL中DDL语句,即数据定义语言,用于创建.删除.修改.库或表结构,对数据库或表的结构操作.常见的有create,alter,drop等.这类语句通常会耗费很大代价,特别是对于大表做表结 ...
- MySQL DDL执行方式-Online DDL介绍
1 引言 大家好,今天与大家一起分享一下 mysql DDL执行方式. 一般来说MySQL分为DDL(定义)和DML(操作). DDL:Data Definition Language,即数据定义语言 ...
- Oracle中如何实现Mysql的两表关联update操作
在看<MySQL 5.1参考手册>的时候,发现MySQL提供了一种两表关联update操作.原文如下: UPDATE items,month SET items.price=month.p ...
- [Django]Django1.8修改MySQL已存在表的问题?
前言:django1.8版本出现这种问题,关于标题不好命令,直接看正文问题描述! 问题描述: 在已经生成了models.py中表的情况下,更改了modes.py中的表,但是syncdb不起作用报错.于 ...
随机推荐
- HDU5790 Prefix 字典树+主席树
分析:这个题和spoj的d_query是一个题,那个是求一段区间里有多少个不同的数字,这里是统计有多少个不同的前缀 用字典树进行判重,(和查询不同的数字一样)对于每个不同的前缀,只保留它最后一次出现的 ...
- 《Python 学习手册4th》 第十四章 迭代器和解析
''' 时间: 9月5日 - 9月30日 要求: 1. 书本内容总结归纳,整理在博客园笔记上传 2. 完成所有课后习题 注:“#” 后加的是备注内容 (每天看42页内容,可以保证月底看完此书) “重点 ...
- <转>Python3.x和Python2.x的区别介绍
1.性能Py3.0运行 pystone benchmark的速度比Py2.5慢30%.Guido认为Py3.0有极大的优化空间,在字符串和整形操作上可以取得很好的优化结果.Py3.1性能比Py2.5慢 ...
- 【Linux学习】 包含子目录的makefile简单应用
1 .目录结构 practice6 / ui / ui.h ui.c practice6 / dal / dal.h dal.c practice6 / bll / bll.h bll.c pr ...
- openfl关于windows平台编译报错解决办法
报错信息: 无法打开程序数据库“e:\newproj\mainclient\bin\windows\cpp\obj\obj\msvc-debug-ncxp\vc.pdb”:如果要将多个 CL.EXE ...
- Spark学习体会
在去年图计算工作中,和公司里实习的博士生尝试过Spark后,发现Spark比Hadoop在计算速度上后很大的提高.Spark的计算使用Scala语言编写代码,其中图计算用到了GraphX.对Spark ...
- C语言相关图书推荐
C Primer Plus(第5版 中文版) 作 者 [美] 普拉塔(Prata S.) 著:云巅工作室 编 出 版 社 人民邮电出版社 出版时间 2005-02-01 版 次 1 ...
- HDU5479 Colmerauer 单调栈+暴力优化
http://acm.hdu.edu.cn/showproblem.php?pid=5749 思路: bestcoder 84 贡献:所有可能的子矩阵的面积和 //len1:子矩阵所有长的和 ;i&l ...
- openstack【Kilo】汇总:包括20英文文档、各个组件新增功能及Kilo版部署
OpenStack Kilo版本发布 20英文文档OpenStack Kilo版本文档汇总:各个操作系统安装部署.配置文档.用户指南等文档 Kilo版部署 openstack[Kilo]入门 [准备篇 ...
- centos 安装git 服务端
// 在服务端安装好git后,开始安装gitosis 3.在服务器安装gitosis sudo yum install python python-setuptools cd /usr/local/s ...