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丢表的更多相关文章

  1. mysql DDL 锁表

    mysql DDL 锁表 select trx_state, trx_started, trx_mysql_thread_id, trx_query from information_schema.i ...

  2. mysql删除大表更快的drop table办法

    mysql删除大表更快的drop table办法 参考资料:https://blog.csdn.net/anzhen0429/article/details/76284320 利用硬链接和trunca ...

  3. MySQL数据库以及表的管理

    MySQL数据库以及表的管理 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 今天我们探讨的话题就是如何使用MySQL做开发,我们运维的主要工作不是去开发SQL的,但尽管如此,我们有 ...

  4. Mysql的建表规范与注意事项

    一. 表设计规范 库名.表名.字段名必须使用小写字母,“_”分割. 库名.表名.字段名必须不超过12个字符. 库名.表名.字段名见名知意,建议使用名词而不是动词. 建议使用InnoDB存储引擎. 存储 ...

  5. 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" 现 ...

  6. MySQL DDL详情揭露

    前言: MySQL中DDL语句,即数据定义语言,用于创建.删除.修改.库或表结构,对数据库或表的结构操作.常见的有create,alter,drop等.这类语句通常会耗费很大代价,特别是对于大表做表结 ...

  7. MySQL DDL执行方式-Online DDL介绍

    1 引言 大家好,今天与大家一起分享一下 mysql DDL执行方式. 一般来说MySQL分为DDL(定义)和DML(操作). DDL:Data Definition Language,即数据定义语言 ...

  8. Oracle中如何实现Mysql的两表关联update操作

    在看<MySQL 5.1参考手册>的时候,发现MySQL提供了一种两表关联update操作.原文如下: UPDATE items,month SET items.price=month.p ...

  9. [Django]Django1.8修改MySQL已存在表的问题?

    前言:django1.8版本出现这种问题,关于标题不好命令,直接看正文问题描述! 问题描述: 在已经生成了models.py中表的情况下,更改了modes.py中的表,但是syncdb不起作用报错.于 ...

随机推荐

  1. 使用IP欺骗Loadrunner并发测试小结

    测试要求:   在本次测试中,我需要并发50个User,每一个User占用一个独立的IP,并且只执行一次脚本.脚本中发起两个请求,其中第一次请求返回200后才执行第二个请求.使用win7 OS.   ...

  2. virtualbox虚拟机中mysql远程连接登陆报2003错误的解决方法

    最近在virtualbox中安装了Ubuntu 14,配置了一个mysql server,设置的桥接网络模式.在其他电脑连接的时候,总是报2003错误.开始以为是localhost没有置换为%,运行u ...

  3. linux常用命令之--磁盘管理命令

    linux的磁盘管理命令 1.查看磁盘空间 df:用于显示磁盘空间的使用情况 其命令格式如下: df [-option] 常用参数: -i:使用inodes显示结果 -k:使用KBytes显示结果 - ...

  4. QC开发只能修改指派给自己的缺陷,而其他的bug可以查看但是不允许修改

    今天在QC9.0项目中增加了几个项目,然后我的想法是:开发只能修改指派给自己的缺陷,而其他的bug可以查看但是不允许修改 虽说qc我还是比较熟悉的,但是对于这个问题,感觉可能要用到脚本,对于脚本我一窍 ...

  5. 如何在 Windows Azure 的虚拟机 ubuntu 上面安装和配置 openVPN(二)

    第二步:登录到虚拟机 一旦创建好虚拟机后,默认azure会打开TCP 22端口,即SSH的端口.所以,我们可以通过远程连接,访问和管理该虚拟机. 首先,下载一个PuTTY软件.该软件很简单,就一个可执 ...

  6. JAVA中的异常(异常处理流程、异常处理的缺陷)

    异常处理流程 1)首先由try{...}catch(Exception e){ System.out.println(e); e.printStackTrace(); }finally{...}结构 ...

  7. windows下安装和配置Weka

    Weka是一款免费的,非商业化的,基于java环境下的开源的机器学习以及数据挖掘软件.Weka里含有各种数据挖掘工具:数据预处理,分类与回归,聚类,关联规则和可视化工具. 一.安装weka 我们首先需 ...

  8. CSS 去掉IE10中type=password中的眼睛图标

    在IE10中,input[type=password],如果我们输入内容后,内容会变成圆点,这与以前一样,但后面多了一个眼睛图标,我们鼠标移过去按下会出现输入内容.有时我们想去掉这功能.IE10允许我 ...

  9. 问题-Delphi2007编译时提示内存错误“sxs.dll. No Debug Info.ACCESS 0xXXXXX"

    相关资料:http://bbs.csdn.net/topics/340132341 问题现象:在调试程序时,未进工程文件中的TApplication.Run;证明不是代码问题. 问题原因:可能是因为* ...

  10. 几个代码片段-计算程序运行时间+获得当前目录+生成MD5

    计算程序运行时间 long startTime = System.currentTimeMillis(); System.out.println("程序运行时间: " + (Sys ...