首页 > 数据库 >MySQL之复制(四)

MySQL之复制(四)

时间:2024-06-19 09:28:39浏览次数:14  
标签:语句 基于 二进制 模式 复制 MySQL 日志

复制

复制的原理

基于语句的复制

在MySQL5.0及之前的版本中只支持基于语句的复制(也称为逻辑复制),这在数据库领域是很少见的,基于语句的复制模式下,主库会记录那些造成数据更改的查询,当备库读取并重放这些事件时,实际上只是把主库上执行过的SQL再执行一遍。这种方式既有好处、也有缺点。
最明显的好处是实现相当简单。理论上讲,简单地记录和执行这些语句,能够让主备保持同步。另一个好处是二进制日志里的事件更加紧凑,所以相对而言,基于语句的模式不会使用太多带宽。一条更新好几兆数据的语句在二进制日志里可能只占几十个字节。另外mysqlbinlog工具是使用基于语句的日志的最佳工具。但事实上基于语句的方式可能并不如看起来那么便利。因为主库上的数据更新除了执行的语句外,可能还依赖于其他因素。例如,同一条SQL在主库和备库上执行的事件可能稍微或很不相同,因此在传输的二进制日志中,除了查询语句,还包括了一些元数据信息,如当前的时间戳。即便如此,还存在着一些无法被正确复制的SQL.例如使用CURRENT_USER()函数的语句。存储过程和触发器在使用基于语句的复制模式时也可能存在问题。
另外一个问题是更新必须是串行的。这需要更多的锁——有时候要特别关注这一点,另外不是所有的存储引擎都支持这种复制模式。尽管这些存储引擎是包括在MySQL5.5及之前版本中发行的。

基于行的复制

MySQL5.1开始支持基于行的复制,这种方式会将实际数据记录在二进制日志中,跟其他数据库的实现比较相像。它有其自身的一些优点和缺点。最大的好处是可以正确地复制每一行。一些语句可以被更加有效地复制。
(基于行的复制没有向后兼容性,和MySQL 5.1 一起发布的mysqlbinlog工具可以读取基于行的复制的时间格式(它对人是不可读的,但MySQL可以解释),但是早期版本的mysqlbinlog无法识别这类事件,在遇到错误时会退出)
由于无须重放更新主库数据的查询,使用基于行的复制模式能够更高效地复制数据,重放一些查询的代价可能会很高。例如,下面有一个查询将数据从一个大表中汇总到小表:

mysql> INSERT INTO summary_table(col1,col2,sum_col3)
    -> SELECT col1,col2,sum(col3)
    -> FROM enormous_table
    -> GROUP BY col1, col2;

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

mysql>UPDATE enormous_table SET col1 =0;

由于这条语句做了全表更新,使用基于行的复制开销会很大,因为每一行的数据都会被记录到二进制日志中,这使得二进制日志事件非常庞大。并且会给主库上记录日志和复制增加额外的负载,更慢的日志记录则会降低并发度。
由于没有哪种模式对所有的情况都是完美的,MySQL能够在这两种复制模式间动态切换,默认情况下使用的是基于语句的复制方式,但如果发现语句无法被正确地复制,就切换到基于行的复制模式。还可以根据需求来设置会话级别的变量binlog_format,控制二进制日志格式。对于基于行的复制模式,很难进行时间点恢复,但这并非不可能

基于行或基于语句:哪种更优?

上面已经讨论了这两种复制模式的优点和缺点,那么在实际应用中哪种方式更优呢?理论上基于行的复制模式整体上更优,并且在实际应用中也适用于大多数场景,但这种方式太新了以至于没有将一些特殊的功能加入到其中来满足数据库管理员的操作需求。因此一些人直到现在还没有开始使用。以下详细地阐述两种方式的优点和缺点,以帮助你决定哪种方式更合适。

  • 1.基于语句的复制模式的优点
    当主备的模式不同时,逻辑复制能够在多种情况下工作。例如,在主备上的表的定义不同但数据类型相兼容、列的顺序不同等情况。这样就很容易现在备库上修改schema,然后将其提升为主库,减少停机事件。基于语句的复制方式一般允许更灵活的操作。
    基于语句的方式执行复制的过程基本上就是执行SQL语句。这意味着所有在服务器上发生的变更都以一种容易理解的方式运行。这样当出现问题时可以很好地去定位
  • 2.基于语句的复制模式的缺点
    很多情况下通过基于语句的模式无法正确复制,几乎每一个安装的备库都会至少碰到一次。事实上对于存储过程,触发器以及其他的一些语句的复制在5.0和5.1的一系列版本中存在大量的Bug。这些语句的复制的方式已经被修改了很多次,以使其更好地工作。简单地说:如果正在使用触发器或者存储过程,就不要使用基于语句的复制模式,除非能够清楚地确定不会碰到复制问题
  • 3.基于行的复制模式的优点
    几乎没有基于行的复制模式无法处理的场景。对于所有的SQL构造、触发器、存储过程等都能正确执行。只是当你试图做一些诸如在备库修改表的schema这样的事情时才可能导致复制失败。这种方式同样可能减少锁的使用,因为它并不要求这种强串行化是可重复的。
    基于行的复制模式会记录数据变更,因此在二进制日志中记录的都是实际上在主库上发生了变化的数据。你不需要查看一条语句去猜测它到底修改了哪些数据。在某种程度上,该模式能够更加清楚地直到服务器上发生了哪些更改,并且哟一个更好的数据变更记录。另外在一些情况下基于行的二进制日志还会记录发生改变之前的数据,因此这可能有利于某些数据恢复。
    在很多情况下,由于无须向基于语句的复制那样需要为查询建立执行计划并执行查询,因此基于行的复制占用更少的CPU.最后在某些情况下,基于行的复制能够帮助更快地找到并解决数据不一致的情况。举个例子,如果是使用基于语句的复制模式,在备库更新一个不存在的记录时不会失败,但在基于行的复制模式下则会报错并停止复制
  • 4.基于行的复制模式的缺点
    由于语句并没有在日志里记录,因此无法判断执行了哪些SQL,除了需要知道行的变化外,这在很多情况下也很重要。使用一种完全不同的方式在备库进行数据变更——而不是执行SQL.事实上,执行基于行的变化的过程就像一个黑盒子,你无法知道服务器正在做什么。并且没有很好的文档和解释,因此当出现问题时,可能很难找到问题所在。例如,若备库使用一个效率低下的方式去寻找行记录并更新,你无法观察到这一点。
    如果有多层的复制服务器,并且所有的都被配置成基于行的复制模式,当会话级别的变量@@binlog_format被设置成STATEMENT时,锁执行的语句在源服务器上被记录为基于语句的模式,但第一层的备库可能将其记录成行模式,并传递给其他层的备库,也就是说你期望的基于语句的日志在复制拓扑种将会被切换到基于行的模式。基于行的日志无法处理诸如在备库修改表的schema这样的情况,而基于语句的日志可以。
    在某些情况下,例如找不到要修改的行时,基于行的复制可能会导致复制停止,而基于语句的复制则不会。这也可以认为是基于行的复制的一个优点。该行为可以通过slave_exec_mode来进行配置。这些缺点正在被慢慢解决。它们在大多数生产环境中依然存在。

复制文件

接下来看看复制会使用到的一些文件,除了前面的二进制日志文件和中继日志文件,起始还有其他的文件会被用到。不同版本的MySQL默认情况下可能将这些文件放到不同的目录里,大多取决具体的配置选项。可能在data目录或者包含服务器.pid文件的目录下(对于类UNIX系统可能是/var/run/mysqld).

  • 1.mysql-bin.index
    当在服务器上开启二进制日志时,同时会生成一个和二进制日志同名的但以.index作为后缀的文件,该文件用于记录磁盘上的二进制日志文件。这里的"index"并不是指表的索引,而是说这个文件的每一行包含了二进制文件的文件名,你可能认为这个文件时多余的。可以被删除(毕竟MySQL可以在磁盘上找到它需要的文件)。事实上并非如此,MySQL依赖于这个文件,除非在这个文件里有记录,否则MySQL识别不了二进制日志文件
  • 2.mysql-relay-bin-index
    这个文件是中继日志的索引文件,和mysql-bin.index的作用类似

标签:语句,基于,二进制,模式,复制,MySQL,日志
From: https://blog.csdn.net/Cover_sky/article/details/139790223

相关文章

  • 关于MySQL数据库基础学习心得与体会
    引言在当今的信息化时代,数据已经成为企业和社会运行的重要驱动力。作为数据的载体,数据库管理系统(DBMS)扮演着至关重要的角色。MySQL作为最流行的开源关系型数据库管理系统之一,因其高性能、可靠性、易用性等特点,被广泛应用于各种规模的系统中。在学习了MySQL数据库基础课程之后,......
  • MySQL常见的后端面试题,你会几道?
     为什么分库分表单表数据量过大,会出现慢查询,所以需要水平分表可以把低频、高频的字段分开为多个表,低频的表作为附加表,且逻辑更加清晰,性能更优随着系统的业务模块的增多,放到单库会增加其复杂度,逻辑不清晰,不好维护,所以会对业务进行微服务拆分,同时拆分数据库怎么分库分......
  • 【MySQL】——概念、逻辑、物理结构设计
    ......
  • 课题分享:校园快领服务系统,基于java+SSM+mysql
     一、前言介绍     随着中国经济的快速发展和互联网技术的普及,信息管理改革确实成为了一种广泛和全面的趋势。在这一背景下,基于MySQL数据库的校园快领服务系统应运而生,这不仅体现了信息化建设在教育领域的深入应用,也展现了现代管理手段在提高工作效率和优化服务体验......
  • 课程分享:校园兼职系统,基于java+SSM+mysql
    一、前言介绍       随着社会的不断发展和科学技术的飞速进步,互联网技术已经变得越来越受到人们的欢迎。在这个快节奏的时代,我们的生活方式也变得越来越忙碌,对生活品质的要求也变得更加严格。因此,对于快速、方便的服务的需求也在逐渐增加。互联网具有许多优点,例如便利......
  • 数据库什么情况使用索引(附MYSQL示例)
    数据库什么情况使用索引1.提高查询性能频繁查询的列排序操作聚集操作2.支持快速数据查找唯一值查找范围查找3.联接操作外键列联接列4.覆盖索引5.全文搜索6.复合索引7.频繁更新的列8.空间索引9.哈希索引1.提高查询性能频繁查询的列假设有一个用户表us......
  • Linux 提权-MySQL UDF
    本文通过Google翻译MySQLUserDefinedFunctions–LinuxPrivilegeEscalation这篇文章所产生,本人仅是对机器翻译中部分表达别扭的字词进行了校正及个别注释补充。导航0前言1什么是用户定义函数(UDF)?2枚举UDF漏洞利用条件2.1手动枚举UDF漏洞利用条件......
  • mysql的安装与环境配置(借鉴)
    (借鉴了csdn大佬:一个有灵魂的程序员的博客)一、文件下载首先去官网下载社区版压缩文件。官网地址:​​​​​​MySQL::DownloadMySQLCommunityServerhttps://dev.mysql.com/downloads/mysql/选择好相应的版本号和对应的操作系统,点击选中的文件下载。下载好的zip文件解压到......
  • mysql数据恢复
    全量备份恢复事件发生后停止后端服务,同时刷新数据库二进制日志,防止有新数据kill-9后端服务端口mysql-u-pflushlogs;刷新后的binlog的id为00004,需要恢复的数据都是00003mysql-uroot-psource/备份文件地址全量备份恢复完成,剩下的数据可根据binlog日志进行恢复增量......
  • 毕业设计:人事管理系统,基于java+springboot+mysql
     一、前言介绍          困扰管理层的许多问题当中,人事管理是一定不敢忽视的一块。但是管理好人事又面临很多麻烦需要解决,例如有几个方面:第一,公司往往员工人数都比较多,如何保证能够管理到每一员工;第二,如何在工作琐碎,记录繁多的情况下将人事变动的情况反应......