问题:

mysql用binary log来保证主从同步的可靠性和安全性,在mysql中,主从同步是异步线程和异步任务来保证的。

(在这点上,其它存储引擎有另外的选项,比如mongoDB和ElasticSearch的核心存储可以执行同步选项。mongoDB甚至支持同步到所有的从库后返回值,这样能够保证主从同步是没有延迟的。)

回到mysql,binary log是如何生成的?哪些操作会记录,哪些操作不会记录?

比如我有个疑问就是,对于事务操作,mysql是如何记录binary log的呢?

这个需要参考文档1:mysql在事务中的同步原理。

我来做个翻译:

先了解下,一个事务中可能包含transactional和nontransactional statement,这两个的区别是什么呢?

transactional statement是指,在事务处理失败,并执行rollback该事务时,该语句会自动回滚,这个是由mysql来保证的;

nontranscational statement是指,在事务处理失败,并执行rollback该事务时,该语句不会自动回滚,需要上层应用,即程序猿来保证。

mysql处理事务语句时遵循两条规则:

规则1:如果该事务的初始化语句是nontransactional语句,会立即写入到binlog中。其它事务语句会被cached。如果事务的结果是commit,那么在事务commit之后,这些cached语句会写入到binlog(之前是不写入的);但是如果事务回滚,有些cached语句仍然会被写入到binlog中,如果这些语句是nontransactional语句(因为这些语句是无法rollback的),其它会被抛弃;

规则2:基于statement的日志,nontransactional语句受系统参数影响(具体是:binlog_direct_non_transactional_updates)。如果该参数为OFF(默认值),日志是不会记录的。如果该参数为ON,nontransactional语句执行后会立即记入日志(而不仅仅是initial nontransactional语句)。其它语句会被保持在transaction缓存中,事务提交后记录日志。binlog_direct_non_transactional_updates对日志记录没有影响,在row-format(基于行)或者mixed-format(混合型日志)的binlog处理中。

我们来对mysql的语句做下区分:

Transactional语句:仅仅操作transactional tables的语句;

Nontransactional语句:仅仅操作nontransactional tables的语句;

Mixed语句:同时会操作nontransactional和transactional tables的语句;

在执行以下任一动作是,Mixed语句(更新一个transactional table)被认为是不安全的:

1,更新或读取临时表(temporary table);

2,读取untransactional table,并且事务的隔离级别是小于 DEPEATABLE_READ(the transaction isolation level is less than DEPEATABLE_READ);

一个事务中,如果一个mixed语句紧跟着要更新transactional table,并且它要执行以下任一操作时,被认为是不安全的:

1,更新任一tabe,and 从临时表中读取;

2,更新任一nontransactional table,并且binlog_direct_non_transactional_updates为OFF;

如果事务之间混合更新transactional 和 nontransactional表,binlog中的语句顺讯是正确的,并且所有已执行的语句被记录在binlog中,即使最后事务被rollback。

然而,如果第一个连接处理的transaction没有执行完毕,此时第二个连接更新的是nontransactional table,语句记录在binlog的顺序是非有序的。原因是,第二个连接执行的更新语句会在执行更新后立即写入到binlog中,而不管第一个连接的执行情况如何。

这里有我个人理解是,第一个连接在处理一个事务,现在进来一个新的连接(connection 2),connection2执行的语句是nontransactional 语句,此时有些观点会认为connection1的语句先记录在binlog中,connection2的语句后被记录在binlog中,但实际情况不是。

如果从库的引擎是nontransactional,主库的事务执行transactional和nontransactional表更新时应当要避免的,因为这会造成数据的不一样(具体指主库的transactional表和从库的nontransactional表)。

每一个事务都会被记录在binlog中,只要是以start开始,commit或者rollback结束。这个对于使用nontransactional存储引擎(比如MyISAM)的表操作语句也同样适用。

要了解什么样的table是transactional table,设么样的table是nontransactional table?参考文档2

参考文档1:https://dev.mysql.com/doc/refman/5.7/en/replication-features-transactions.html

文档2:https://dev.mysql.com/doc/refman/5.7/en/nontransactional-tables.html

【mysql】主从同步,事务等概念的更多相关文章

  1. Mysql主从同步(1) - 概念和原理介绍 以及 主从/主主模式 部署记录

    Mysql复制概念Mysql内建的复制功能是构建大型高性能应用程序的基础, 将Mysql数据分布到多个系统上,这种分布机制是通过将Mysql某一台主机数据复制到其它主机(slaves)上,并重新执行一 ...

  2. 这次一定要教会你搭建Redis集群和MySQL主从同步(非Docker)

    前言 一直都想自己动手搭建一个Redis集群和MySQL的主从同步,当然不是依靠Docker的一键部署(虽然现在企业开发用的最多的是这种方式),所以本文就算是一个教程类文章吧,但在动手搭建之前,会先聊 ...

  3. Mysql主从同步(复制)

    目录: mysql主从同步定义      主从同步机制 配置主从同步      配置主服务器      配置从服务器 使用主从同步来备份      使用mysqldump来备份      备份原始文件 ...

  4. mysql主从同步+mycat读写分离+.NET程序连接mycat代理

    背景 最近新项目需要用到mysql数据库,并且由于数据量大的原因,故打算采用1主1从(主数据库负责增.删.改操作:从数据库负责查操作)的数据库架构,在实现主从之后还要实现读写分离的代理,在网上搜寻了很 ...

  5. mysql主从同步(3)-percona-toolkit工具(数据一致性监测、延迟监控)使用梳理

    转自:http://www.cnblogs.com/kevingrace/p/6261091.html 在mysql工作中接触最多的就是mysql replication mysql在复制方面还是会有 ...

  6. mysql 主从同步 mysql代理服务器

    搭建mysql主从同步(实现数据自动备份)实例:把主机192.168.4.100的数据库配置为主机192.168.4.99的从数据库 主数据库服务器配置修改配置文件: [root@mysql ~]# ...

  7. Mysql主从同步(复制)(转)

    文章转自:https://www.cnblogs.com/kylinlin/p/5258719.html 目录: mysql主从同步定义 主从同步机制 配置主从同步 配置主服务器 配置从服务器 使用主 ...

  8. mysql主从同步(2)-问题梳理

    之前详细介绍了Mysql主从复制的原理和部署过程,在mysql同步过程中会出现很多问题,导致数据同步异常.以下梳理了几种主从同步中可能存在的问题:1)slave运行过慢不能与master同步,也就是M ...

  9. 【实操笔记】MySQL主从同步功能实现

    写在前边: 这两天来了个需求,配置部署两台服务器的MySQL数据同步,折腾了两天查了很多相关资料,一直连不上,后来发现其实是数据库授权的ip有问题,我们用的服务器是机房中的虚拟机加上反向代理出来的,坑 ...

  10. mysql系列之6.mysql主从同步

    普通文件的数据同步 nfs: 网络文件共享 samba: 共享数据 定时任务或守护进程结合 rsync.scp inotify(sersync)+rsync 触发式实时数据同步 ftp数据同步 ssh ...

随机推荐

  1. 深度学习原理与框架-RNN网络架构-RNN网络 1.RNN的前向传播 2.RNN的反向传播

    对于神经网络而言,每一个样本的输入与输入直接都是独立的,即预测的结果之间并没有联系 而对于RNN而言:不仅仅是有当前的输入,而且上一层的隐藏层也将进行输入,用于进行结果的预测.因此每一个输入都与之前的 ...

  2. 机器学习进阶-图像金字塔与轮廓检测-轮廓检测 1.cv2.cvtColor(图像颜色转换) 2.cv2.findContours(找出图像的轮廓) 3.cv2.drawContours(画出图像轮廓) 4.cv2.contourArea(轮廓面积) 5.cv2.arcLength(轮廓周长) 6.cv2.aprroxPloyDP(获得轮廓近似) 7.cv2.boudingrect(外接圆)..

    1. cv2.cvtcolor(img, cv2.COLOR_BGR2GRAY) # 将彩色图转换为灰度图 参数说明: img表示输入的图片, cv2.COLOR_BGR2GRAY表示颜色的变换形式 ...

  3. svn下载地址

    SVN svn服务器端下载: https://www.visualsvn.com/server/download/ svn eclipse插件地址(new soft install): http:// ...

  4. html表单中get与post之间的区别

    当用户在 HTML 表单 (HTML Form) 中输入信息并提交之后,有两种方法将信息从浏览器传送到 Web 服务器 (Web Server). 一种方法是通过 URL,另外一种是在 HTTP Re ...

  5. RabbitMQ系列教程之六:远程过程调用(RPC)(转载)

    RabbitMQ系列教程之六:远程过程调用(RPC) 远程过程调用(Remote Proceddure call[RPC]) (本实例都是使用的Net的客户端,使用C#编写) 在第二个教程中,我们学习 ...

  6. Linux性能测试分析命令_iostat

    iostat用于输出CPU和磁盘I/O相关的统计信息 iostat语法 用法:iostat [ 选项 ] [ <时间间隔> [ <次数> ]] 常用选项说明: -c:只显示系统 ...

  7. 第一个Python脚本!

    # hello.py print 'Hello Pythons'

  8. Java复习 之多线程

    线程是一个程序中的不同路径 例子1 只有一条路径 每一个分支都是一个线程 实际上在一个时刻内 电脑只能运行一个进程 但是因为cpu运算速度很快 将时间分出来了 所以我们感觉是同时运行 创建线程的两种方 ...

  9. unity 随笔

    转载 慕容小匹夫   从游戏脚本语言说起,剖析Mono所搭建的脚本基础      深入浅出聊优化:从Draw Calls到GC    谁偷了我的热更新?Mono,JIT,IOS     JS or C ...

  10. PageRank算法和谷歌搜索讲解

    PageRank算法和谷歌搜索讲解 吴裕雄 PageRank算法实际上就是Google使用它来计算每个网页价值的算法. Google每次的搜索结果都有成百上千万甚至上亿个相关的查询网页链接.如果将所有 ...