根据参与复制的主数据库所使用的二进制日志格式的不同,复制可以分为基于SQL语句的复制,和基于行的复制,那么基于SQL语句的复制呢,就是指的是主数据库服务器的二进制日志的格式,使用statement这种格式,而基于行的复制呢,就是主库的二进制日志呢,所使用的是基于行的日志格式,如果我们的主库设置的是混合格式的话,则复制时会根据实际内容基于SQL语句的复制,和基于行的复制之间呢,切换,前面已经介绍了这两种格式的优缺点
下面我们再来看一看使用这两种格式进行复制,对复制会有什么样的影响,首先基于SQL语句的复制,也称之为SBR,在MYSQL5.1.4的版本中,只存在于基于SQL语句的方式,所以又称之为逻辑复制,在这种复制模式下呢,主库会记录进行修改的SQL语句,备库则会读取存放的这些SQL语句,就是把主库上执行的SQL语句呢,从库上再从新执行一遍,所以大家通过上面的介绍呢,可以知道,在这种复制模式下,主库的二进制日志格式呢,可能就是基于段的这种格式,因此也会受到这种日志记录格式的影响,我们来看一下这种复制模式的优缺点是什么,首先基于SQL语句复制的优点呢,在于由于使用的是段的日志格式,所以生成的日志量比较少,这样就会节约网络传输的IO,如果一条更新好几兆的语句呢,只会占几十个字节,如果从数据库上表的定义呢不同,但是数据类型是可以兼容的,或者是列的顺序不同时,那么基于SQL语句的复制呢,可以很好地工作,这样对于大表进行表结构修改的时候呢,很容易的在从服务器上进行修改,然后再进行主从服务器的切换,这样就可以减少大表进行修改的屏蔽时间,特别是在老版本的MYSQL中,几乎这就是大表修改的最好方式了,那么使用基于SQL语句复制的第三个好处呢,相比于基于行的方式,他更为灵活,由于日志记录中呢,我们主库上所执行的SQL语句,所以我们很容易定位问题的发生,说完了优点呢,当然这个缺点是什么,首先SBR的复制呢,类型的缺点呢,也和主库所使用的二进制格式,为段的日志格式呢,有很大的关系,他的第一个缺点,就是对于非确定性事件,无法保证主从复制数据的一致性,比如UUID这个函数,在主从服务器上,分别执行后,所要得到的结果呢,可能会是不一样的,我见过一些项目呢,把UUID来作为表的主键来使用的,如果使用基于SQL语句的复制,这些表的主键呢,在主从服务器上就会产生差异,这样的结果呢,我们是无法接受的,同时呢由于主从服务器,处理的不一致,就会导致主从链路的中断,那么第二个缺点呢,和第一个缺点你也有点类似,由于SBR的一些bug,会使得一些存储过程,像触发器啊,自定义函数啊,主从服务器上的执行结果也是不一样的,这样也会造成主从服务器数据的不一致,虽然这些bug呢,很多已经得到了解决,不过出于一种安全的考虑,最好还是避免使用这种复制的类型,使用SBR复制呢,还有一个问题,就是当我们批量执行一个SQL的时候,这个SQL在主库上执行时,那么在从库上执行时呢,同样要锁定相同行数的数据,而如果使用基于行的复制,在从库上执行的时候呢,就只需要指定更新的一行数据就可以了,所以同使用基于行的数据相比,基于SQL的复制类型呢,在进行界内SQL操作时呢,所产生SQL修改时,就是在大批量SQL修改之后,数据同步时,重复的性能要低于基于行的方式,以上就是基于SQL的优缺点,大家可以看到,这些优缺点呢,是由于主库所使用的二进制日志格式,所决定的,下面我们就来看一下,另外一种复制类型

也就是基于行的复制类型优缺点又是什么呢,前面我们已经提到过了,所谓的基于行的复制,就是指的是,主库服务器的二进制日志,类型所使用的是ROW格式,所以这种类型的优缺点呢,也和ROW格式的二进制日志格式呢,是息息相关的,其优点,由于主数据库服务器,也用的是二进制服务器,是ROW格式的,所以在主从同步时,从服务器上的主库上,对某一行数据所做的修改,所以可以保证,在从上做的数据修改呢,在主上是一致的,而不管主服务器上在修改数据时,否则存储过程,触发器等等,比如我们在主上对于插入一个UUID函数所生成的值,那么在基于SQL的复制呢,同样的会执行一个UUID函数,以生成这个值,所以从上生成的新值和我们的这个值呢,是有可能是不同的,另外这个问题也是基于段的二进制日志格式,对数据库进行恢复的时候,如果是基于行的复制中呢,从主上传输到从上生成的UUI值是什么,那么在从上呢会更新成什么,而不用重新在计算了,所以可以完全保证主从数据库呢,数据是一致的,那么使用行复制的第二个好处呢,可以减少服务器上锁的使用,看一下下面的这个SQL,那么这个SQL呢,执行时会对整个表进行锁定,如果使用基于段的复制,那么在从库上呢,执行的时间,同样要对order表进行锁定,而如果使用基于行的复制,我只要同步order_cnt表,增加行的数据就可以了,在从DB服务器上呢,并不需要对order表进行锁定了,所以说基于行的复制,可以减少从服务器这种锁的使用,增加从服务器并发的性能,同时对于这种SQL来说呢,同步数据所需要的时间,基于行的复制呢,要比基于SQL语句的复制方式呢,要少的多,这样也就从另一方面增强了主从复制的性能,以上就是基于行复制的一些优点

同样我们要看看他的缺点是什么,基于行的复制存在的第一个问题呢,是要求主从数据库的表结构,必须要一致,对于相同的列,即使列的顺序不同,也有可能产生问题,否则就会引起复制链的中断,当然这种情况也是有例外的,如果我们是在从服务器表的末尾增加列的话,这种情况复制并不会被中断,但是一旦在主上对同一个表增加了其他的列,并且没有指定这个列的顺序的情况下,当对这个表的修改复制到从上,就会中断复制链路,所以还是建议大家要保持主从数据库的一致,这是一种最安全的一种方式,另外由于是基于行的复制,由于在从服务器上应用主服务器对行的修改,而不是从新执行SQL,只想在从服务器上执行一些触发器,以记录数据的变更,比如用于数据的抽取,单独的在从上执行一些触发器,对某些表的变更呢,进行一些记录,以方便我们做抽取,这种情况下呢,基于SQL语句的复制,是完全可以运行的,因为它只是在从上执行了SQL语句,同样会触发在从上的触发器,但是基于行的复制呢,方案呢就无法工作了,因为在基于行的复制中呢,实际上并没有执行SQL语句,而是直接对数据的修改,这样是不会触发在从上的触发器的

以上介绍了两种方式的优缺点,综合考虑还是建议大家,使用基于行的复制,因为这种复制方式呢,对主从复制的数据呢更加的有保证,现在我们已经对MYSQL的复制方式呢,有了一定的了解,在进行具体的复制配置之前,我们还要知道MYSQL复制是如何工作的只有知道了MYSQL复制的工作原理,在复制出现问题的时候,我们才能知道如何解决这个问题

mysql二进制日志格式对复制的影响相关推荐

  1. mysql 二进制日志变化_mysql-二进制日志

    mysql---二进制日志 记录了所有对MySQL数据库的修改事件,包括增删改查事件和对表结构的修改事件 二进制日志的开启 #是否启用了日志 mysql> show variables like ...

  2. mysql二进制日志内容说明_MySQL二进制日志相关问题详细说明

    软件安装:装机软件必备包 SQL是Structured Query Language(结构化查询语言)的缩写.SQL是专为数据库而建立的操作命令集,是一种功能齐全的数据库语言.在使用它时,只需要发出& ...

  3. oracle 二进制日志格式,二进制日志

    二进制日志记录了对数据库执行更改的所有操作,但是不包括SELECT和SHOW这类操作,因为这类操作对数据本身并没有修改,如果你还想记录SELECT和SHOW操作,那只能使用查询日志,而不是二进制日志了 ...

  4. 不属于mysql二进制日志相关的参数_MySQL二进制日志相关问题详解

    本文出处: (保留出处并非什么原创作品权利,本人拙作还远远达不到,仅仅是为了链接到原文,因为后续对可能存在的一些错误进行修正或补充,无他) 今天无意中发现了一个云栖社区举行的MySQL"第一 ...

  5. mysql 二进制日志恢复

    mysql开启二进制日志记录文件 # Binary Logging. log-bin=/data0/mysql/mybinlog.log sync_binlog=1 innodb_support_xa ...

  6. mysql完全备份 二进制日志,MySQL二进制日志备份和恢复详解

    原文链接:http://www.showerlee.com/archives/681 ****经实践,该教程ok,特在此分享**** 基本概念 定义: 二进制日志包含了所有更新了数据或者已经潜在更新了 ...

  7. mysql 二进制日志

    1.日志类型 二进制日志记录了所有对mysql数据库的修改事件,包括增删改事件和对表结构的修改事件. 2.配置使用二进制日志 在my.ini 配置 log-bin=mysql-bin 3.二进制日志格 ...

  8. mysql 二进制日志详解_Mysql二进制日志详解

    引言 注:图片取自网络 提一下比较重要的几个: 重做日志(Redo Log):重做日志是实现mysql事务的持久性的原理之一,当新增数据时,Redo Log会备份新数据,在事务提交前,只要持久化Red ...

  9. mysql二进制日志管理_MYSQL二进制日志管理脚本

    MYSQL二进制日志管理脚本脚本原理是每小时对进行flush生成新的二进制日志,将二进制日志备份至NFS,并压缩存放:#!/bin/bash#Purpose:管理二进制日志,每小时刷新二进制日志,并将 ...

最新文章

  1. Microsoft程序员测试题
  2. 使用mybatis-generator自动生成model、dao、mapping文件
  3. CentOS搭建FTP
  4. 数据结构与算法 | 用栈实现队列
  5. 如何在Visual Studio 2017中使用C# 7+语法
  6. Sigmatel37xx GPIO的使用
  7. Your Bitbucket account has been locked. To unlock it and log in again you must solve a CAPTCHA.
  8. B6-简析响应者链条
  9. 开课吧:人工智能技术应用面临的挑战包括哪些方面?
  10. 【字符编码】Java字符编码详细解答及问题探讨
  11. [CF920G]List Of Integers
  12. 手动实现读写锁(线程级)
  13. 学生个人网页设计作品 学生个人网页模板 简单个人主页成品 个人网页制作 HTML学生个人网站作业设计代做
  14. 2021十大进销存软件排名
  15. http://www.baidu.com/cb.php?,帮助文档首页/百度翻译
  16. IndentationError: unindent does not match any outer indentation level
  17. 在使用JOOQ前,这些问题不能不清楚
  18. html5 indexeddb,关于使用HTML5提供的indexedDB的一下心得
  19. Excel基础操作1
  20. C/C++中的STL库

热门文章

  1. Coreseek-带中文分词的Sphinx
  2. Memcached Client 使用手册
  3. HDU 3032 Nim or not Nim?
  4. 11个笑话让你领悟人生
  5. 【struts2】struts2拦截器
  6. JavaScript强化教程——JavaScript Math(算数) 对象
  7. ENode 2.0 - 深入分析ENode的内部实现流程和关键地方的幂等设计
  8. simware模拟交换机的方法
  9. 【技术贴】红警三卡||红警三卡在游戏开始界面卡在右上角小星星卡在美女界面卡在创建名字黑屏的解决方案...
  10. Windows Azure 真实案例:CCH 财政服务独立软件开发商(ISV)通过托管服务获得了灵活性并节省成本...