一、基于语句的复制

在MySQL5.0之前的版本只支持基于语句的复制(也称为逻辑复制),这在数据库领域是很少见的。基于语句的复制模式下,主库会记录那些造城数据更改的查询,当备库读取并重放这些事件时,实际上只是将主库上的SQL再执行一遍。 这种方式的既有好处,又有缺点。

最明显的好处就是实现简单。理论上讲,简单的记录和执行这些语句,能够让主备保持同步。另一个好处是二进制日志文件里的事件更加紧凑,所以相对而言,基于语句的模式不会使用太多带宽。一条更新好几兆的语句在二进制日志文件里可能只占用几十个字节。另外使用 mysqlbinlog  工具是使用基于语句的日志的最佳工具。

但事实上基于语句的复制可能并不如此便利。因为主库上的数据更新除了执行的语句外,可能还依赖于其他因素。例如,同一条SQL在主库和备库上执行的时间可能稍微不同,因此在传输的二进制日志中,除了查询语句,还包括了一下元数据信息,如当前的时间戳。即便如此,还存在一些无法被正确复制的SQL。例如,使用CURRENT_USER() 函数的语句。存储过程和触发器在使用基于语句的复制也可能存在问题。

二、基于行的复制

MySQL5.1开始支持基于行的复制,这种方式会将实际数据记录在二进制日志中,跟其他数据库比较相像。它有其自身的一些优点和缺点。最大的好处是可以正确的复制每一行,一些语句可以被更加有效地复制。

由于无法重放更新主库数据的查询,使用基于行的复制模式能够高效地复制数据。重放一些查询的语句代价可能会更高。例如:

mysql> INSERT INTO table1 (col1,c ol2, col3)-> SELECT col, col2, sum(col3)-> form table2-> GROUP BY col1, col2;

如果表 table1 的列 col1, col2有三种组合,这个查询可能会在源表上扫描多次,但最终只会在目标表上产生三行数据。但基于行的复制方式,在备库上的开销可能会小很多。这种情况下,使用基于行的复制更加高效。

但在另一方面,下面的sql语句使用基于语句的复制方式代价会小很多:

msyql> update table set col1 = 1;

由于做了全表更新,使用基于行的复制开销会很大。

由于没有哪种模式对所有的情况都是完美的,MySQL能够在这两种模式间动态切换。默认情况下使用的是基于语句的复制方式,但如果发现语句无法被正确复制,就切换到基于行的复制。

对于基于行的复制,很难进行时间点的恢复,但这并非不可能。可以利用日志服务器进行恢复。

三、基于行或基于语句:哪种更优

理论上,基于行的模式整体上更优,并且在实际应用中也适合大多数场景。以下详细阐述两种方式的优点和确定。

  • 基于语句的复制模式的优点

    当主备的模式不同时,逻辑能够在大多数情况下工作。例如,在主备上的表的定义不同但数据类型相兼容、列的顺序不同等情况。这样就很容易现在备库上修改schema,然后将其提升为主库,减少停机时间。基于语句的复制一般允许更为灵活的操作。

    基于语句的方式执行复制的过程基本上就是执行SQL语句。这意味着所有在服务器上发生的变更都以一种容易理解的方式允许。

  • 基于语句的复制模式的缺点

    很多情况下通过基于语句的模式无法正确的复制,几乎每一个安装的备库都会至少碰到一次,事实上对于存储过程、触发器以及其他的一些语句的复制在 5.0 和5.1 的一系列版本中存在大量的bug。这些语句复制的方式已经被修改了很多次,以使其更好的工作。简单的说,如果正在使用触发器和存储,就不要使用基于语句的复制模式。

  • 基于行的复制的优点

    几乎没有基于行的复制模式无法处理的场景。对于所有的SQL构造、触发器、存储过程等都能正确执行。只是当你试图做一些诸如备库正在修改表的 schema 这样的事情时才能导致复制失败。

    这样方式同样可能减少锁的使用,因为它并不要求这种强串行化是可重复的。

基于行的复制模式会记录数据变更,因此在二进制日志中记录的都是实际在主库上变化了的数据。另外在一些情况下基于行的二进制日志文件还会记录发生改变之前的数据,因此这可能有利于某些数据的恢复。

在很多情况下,由于无须像基于语句的复制那样需要为查询的建立执行计划并执行查询,因此基于行的复制占用更少的CPU。

  • 基于行的复制的缺点

    由于语句并没有在日志里记录,因此无法判断执行了哪些SQL,除了需要知道行的变化外,这在很多情况下也很重要。

    使用一种完全不同的方式在备库进行数据变更——而不是执行SQL。事实上,基于行的变化更像是一个黑盒子,你无法知道服务器在做什么,并且没有很好的文档和解释。

四、复制文件 

接下来,我们来看看复制会用到的文件。前面已经介绍了二进制日志文件和中继日志文件,其实还有其他的文件也会被用到。

mysql-bin.index

当在服务器上开启二进制日志时,同时会生成一个和二进制日志同名的但以 .index 作为后缀的文件,该文件用于记录磁盘上的二进制日志文件。这里的 index 并不是指表的索引,而是说这个文件的每一行包含了二进制文件的文件名。

mysql-relday-bin-index

这个文件是中继日志的索引文件,和 mysql-bin.index 的作用类似。

master.info

这个文件是用于保存备库连接到主库所需要的信息,格式为纯文本,不同的SQL版本,其记录的信息也可能不同。此文件不能删除,否则无法连接到主库。这个文件以文本的格式记录了复制用户的密码,因此要注意此文件的权限控制。

relay-log.info

这个文件包含了当前备库复制的二进制日志和中继日志坐标,同样不能删除。

五、发送复制事件到其他备库

log_slave_updates 选项可以让备库变成其他服务器的主库。在设置该选项后,MySQL会将其执行的事件记录到它自己的二进制日志文件中。这样它的备库就可以从其日中检索并执行事件。

在这种场景下,主库将数据更新事件写入二进制日志,第一个备库提取并执行这个事件,这时候一个事件的生命周期应该已经结束了,但由于设置了log_slave_updates ,备库会将这个事件写入自己的二进制日志文件中。这样第二个备库就可以将事件提取到它的中继日志中并执行。默认这个选项是打开的,这样在连接到备库时就不用重启服务器了。

六、复制过滤器

复制过滤器选项允许仅复制服务器上的一部分数据。有两种复制过滤方式:在主库上过滤记录到二进制日志文件中的事件,以及在备库上过滤记录到中继日志的事件。

可以使用 binlog_do_db 和 binlog_ignore_db来 控制过滤,但通常不需要开启。因为这样不仅会破坏复制,还可能会导致从某个时间点的备份进行数据恢复时失败。

在备库上,可以通过设置 replicate_* 选项,在从中继日志中读取事件时进行过滤。可以复制或忽略一个或者多个数据库,把一个数据库重写到另一个数据库,或使用类似的 LIKE 的模式复制或忽略数据库表。

更好的办法是阻止一些特殊语句被复制,通常是设置 SQL_LOG_BIN = 0, 虽然这种方法也有它的缺点。总的来说,不要使用复制过滤,因为它很容易中断复制并导致问题,在需要灾难恢复时也会带来极大的不方便。

MySQL 复制(四:复制原理)相关推荐

  1. mysql 串行复制_MySQL 复制(四:复制原理) | 剑花烟雨江南

    一.基于语句的复制 在MySQL5.0之前的版本只支持基于语句的复制(也称为逻辑复制),这在数据库领域是很少见的.基于语句的复制模式下,主库会记录那些造城数据更改的查询,当备库读取并重放这些事件时,实 ...

  2. MySql(四):常用工具、日志、复制

    1. MySql中常用工具 1.1 mysql 该mysql不是指mysql服务,而是指mysql的客户端工具.语法 : mysql [options] [database] 1.1.1 连接参数 : ...

  3. mysql 半同步复制_Mysql半同步复制原理及问题排查

    mysql半同步复制和异步复制的差别如上述架构图所示:在mysql异步复制的情况下,Mysql Master Server将自己的Binary Log通过复制线程传输出去以后,Mysql Master ...

  4. mysql 基于语句的复制_MySQL 复制 - 性能与扩展性的基石 1:概述及其原理

    1. 复制概述 MySQL 内置的复制功能是构建基于 MySQL 的大规模.高性能应用的基础,复制解决的基本问题是让一台服务器的数据与其他服务器保持同步.接下来,我们将从复制概述及原理.复制的配置.常 ...

  5. MySQL主备复制原理、实现及异常处理

    欢迎支持笔者新作:<深入理解Kafka:核心设计与实践原理>和<RabbitMQ实战指南>,同时欢迎关注笔者的微信公众号:朱小厮的博客. 欢迎跳转到本文的原文链接:https: ...

  6. 详解MySQL双活同步复制四种解决方案

    详解MySQL双活同步复制四种解决方案 参考文章: (1)详解MySQL双活同步复制四种解决方案 (2)https://www.cnblogs.com/wuchangsoft/p/10390552.h ...

  7. mysql redo 物理复制 彭立勋_MySQL基础技能与原理——基本原理.ppt

    MySQL基础技能与原理--基本原理.ppt MySQL基础技能与原理基本原理,MySQL DBA Team,彭立勋(),内容概要,1. MySQL体系架构 2. InnoDB特点 3. MySQL高 ...

  8. Keepalived+LVS+MySQL双主复制实现读写负载均衡及高可用

    目录 一.Keepalived和LVS简介 1. Keepalived简介 2. LVS简介 二.安装配置 1. 下载安装LVS 2. 下载安装Keepalived 3. Keepalived配置 5 ...

  9. MySQL半同步复制(文章讲解很透彻!)

    从MySQL5.5开始,MySQL以插件的形式支持半同步复制.如何理解半同步呢?首先我们来看看异步,全同步的概念 一.三种同步 异步复制(Asynchronous replication) MySQL ...

  10. mysql主主复制、主从复制、半同步的实现

    实验前提:两台服务器 Master server:172.16.23.1 slave server:172.16.23.2 一.mysql主从服务器实现 简单介绍: MySQL支持单向.异步复制,复制 ...

最新文章

  1. GNU make manual 翻译( 一百四十九)
  2. 瞄准VR游戏市场,这款数据手套还提供模块化定制
  3. Codeforces Gym 100676G Training Camp 状压dp
  4. 疫情之下,“无接触”生意火了
  5. 销售订单按交货单合并Billing
  6. 拼音开头有什么字_语文基础 孩子刚上一年级学习拼音太难了?家长在家这样教真不比老师差!...
  7. 解析函數論 Page 22 級數收斂的一個充分條件
  8. 微服务java模块内存管理_Java 9模块服务
  9. 文件上传~Uploadify上传控件~续(多文件上传)
  10. 计算机上没有信任的用户,服务器上的安全数据库没有此工作站信任关系的计算机帐户 解决办法...
  11. Asp.net中Global.asax
  12. 一个比较有含金量的架构认证
  13. JSP中文乱码问题终极解决方案(下)
  14. Camera启动过程简述(MTK)
  15. 图文实例带你了解香农编码和霍夫曼编码
  16. 利用易语言实现简单的文本加密和解密
  17. Windbg使用详解
  18. Git命令问题:fatal: Exiting because of unfinished merge
  19. Verilog语言语句介绍
  20. Unity 第三方SDK框架接入 (Android Studio)

热门文章

  1. java aio事件模型_JAVA AIO
  2. (一个刚刚结束秋招的本科生)应届生面试经验
  3. linux不清楚软件包名字,技术|Shilpa Nair 分享的 RedHat Linux 包管理方面的面试经验...
  4. netstat 命令
  5. Android软件开发之发送短信与系统短信库解析(三十)
  6. linux shell 发送图片,51CTO博客-专业IT技术博客创作平台-技术成就梦想
  7. 无尽神域服务器维护,无尽神域手游进不去怎么办 无尽神域手游进不去原因及解决办法[多图]...
  8. 正确配置WampServer根目录
  9. css 更改text样式,JavaScript 中用 cssText 设置 CSS 样式
  10. Python实战计划学习作业1-3