作者介绍: 赵伟 腾讯云TDSQL数据库开发者

MySQL (这里的MySQL是指广义的mysql,包括oracle,mysql,percona,mariadb等)的Statement Based Replication (SBR)是一个暗坑无数的功能,可能导致主备机数据不一致,以及其它问题,所以在TDSQL中我们使用RBR。这里就列举几条SBR的坑。

在此之前,先说说SBR的有点。与Row based Replication (RBR)相比,它可以避免传输大量的binlog日志从而减小网络和存储系统(binlog文件)的负载。另外,某些时候在备机上面重新执行SQL语句反而会比逐条执行RBR的binlog要快,一个极端的例子是,如果一个表没有主键,然后一个delete/update语句需要删除/更新大量的行,那么使用RBR将是噩梦,因为备机处理每一条这样的binlog都会导致全表扫描从而大大降低备机的性能(所以在TDSQL中我们默认强制创建含有主键的表)。但是使用SBR的话,一次执行即可更新/删除全部行,这样就快了很多。

下面正式开始批评SBR了。

首先,由于SBR模式下,SQL语句到了备机需要被重新执行,与RBR相比,就增加了重新执行SQL语句的额外开销,包括解析,优化和执行SQL语句。RBR则直接调用mysql的存储引擎接口(handler API)来执行行的插入、删除和更新,完全跳过了mysql的优化器的处理逻辑。

SQL语句到了备机需要被重新执行,在多种情况下就会导致主备机数据不一致,比如一个SQL语句调用了用户定义的函数,调用了返回随机值的函数,在数据表中使用了自增列,以及使用了上下文数据(context data,比如用一个表的行数作为某个插入字段值,或者在update/delete语句中使用了limit子句)等等。

另一个一致性陷阱在于使用MyISAM等非事务存储引擎。在完全使用innodb等事务存储引擎的情况下,MySQL replication是crash safe的,也就是说,无论任何时刻mysql server crash了,或者OS crash了,或者机器断电了,mysql server都可以恢复数据到crash之前的状态,确保事务的持久性和一致性,确保所有之前提交的事务的改动都存在,因为innodb自身支持事务,可以恢复,并且在近年版本的mysql和mariadb中,innodb可以使用到binlog数据来完成恢复。(尽管组提交时候并没有刷盘commit日志) 但是一旦使用了非事务存储引擎,那么一个事务的完整性就不存在了,也不是crash safe的了。在master和slave上面都是这样。虽然mysql的各个分支和版本在replication实现中做了很多努力来避免一些问题,并且给用户强制了一大堆暗坑无数的DOs&DONTs,但是无法完全解决这个问题。当发生了crash之后,只要一个事务读取 并且/或者 写入到了MyISAM表,那么这个事务的改动可能部分存在,部分消失,并且binlog与数据表也可能会有各种不同,然后,用户的数据就无法使用了。

第三,在使用innodb/xtradb并且隔离级别是read committed时候,如果设置binlog_format为statement,那么mysql会拒绝后续的插入/更新/删除操作,错误信息是:

ERROR 1665 (HY000): Cannot execute statement: impossible to write to binary log since BINLOG_FORMAT = STATEMENT and at least one table uses a storage engine limited to row-based logging. InnoDB is limited to row-logging when transaction isolation level is READ COMMITTED or READ UNCOMMITTED.

但是在设置这两个变量的时候却并没有报错。这个组合也是会导致slave在并发执行时候的数据一致性问题。 所以,还是推荐大家使用RBR和INNODB(或者其他支持事务的存储引擎)的搭配,我们一直用它:)

相关推荐

MySQL AHI 实现解析

腾讯云TDSQL数据库系统架构介绍


此文已由作者授权腾讯云技术社区发布,转载请注明文章出处,获取更多云计算技术干货,可请前往腾讯云技术社区

欢迎大家关注腾讯云技术社区-博客园官方主页,我们将持续在博客园为大家推荐技术精品文章哦~

腾讯云数据库团队:MySQL语句复制(SBR)的缺陷列举的更多相关文章

  1. 腾讯云数据库团队:浅谈如何对MySQL内核进行深度优化

    作者介绍:简怀兵,腾讯云数据库团队高级工程师,负责腾讯云CDB内核及基础设施建设:先后供职于Thomson Reuters和YY等公司,PTimeDB作者,曾获一项发明专利:从事MySQL内核开发工作 ...

  2. 腾讯云数据库团队:MySQL数据库的高可用性分析

    作者介绍:易固武,腾讯高级工程师,参与腾讯账号安全建设,腾讯数据仓库(TDW)优化改造,腾讯云数据库等项目,对大规模分布式存储和计算系统有浓厚的兴趣和经历 MySQL数据库是目前开源应用最大的关系型数 ...

  3. 腾讯云数据库团队:MySQL AHI 实现解析

    MySQL 定位用户记录的过程可以描述为:打开索引 -> 根据索引键值逐层查找 B+ 树 branch 结点 -> 定位到叶子结点,将 cursor 定位到满足条件的 rec 上:如果树高 ...

  4. 腾讯云数据库团队:phpMyAdmin中sql-parser组件的使用

    phpMyAdmin是一款基于Web端运行的开源数据库管理工具,支持管理MySQL和MariaDB两种数据库. phpMyAdmin的程序主要使用php和javascript开发,它的安装使用都比较简 ...

  5. 腾讯云数据库团队:PostgreSQL TOAST技术理解

    作者介绍:胡彬 腾讯云高级工程师 TOAST是"The Oversized-Attribute Storage Technique"的缩写,主要用于存储一个大字段的值.要理解TOA ...

  6. 腾讯云数据库团队:MySQL5.7 JSON实现简单介绍

    作者介绍:吴双桥 腾讯云project师 阅读原文.很多其它技术干货.请訪问fromSource=gwzcw.57435.57435.57435">腾云阁. 本文主要介绍在MySQL ...

  7. 腾讯云数据库团队:SQL Server 数据加密功能解析

    数据加密是数据库被破解.物理介质被盗.备份被窃取的最后一道防线:数据加密,一方面解决数据被窃取安全问题,另一方面有关法律要求强制加密数据:SQL Server 的数据加密相较于其他数据库,功能相对完善 ...

  8. MySQL之父造访腾讯云 为腾讯云数据库开源点赞

    近日,技术大牛 MariaDB 公司创始人兼CTO Michael Widenius(又名Monty).MariaDB 基金会主席 Kaj 来到中国,针对MariaDB与腾讯云的技术合作进行回访.去年 ...

  9. TDSQL|三篇论文入选国际顶会SIGMOD,厉害了腾讯云数据库

    好消息!6月13日,腾讯云数据库三篇论文再次入选数据库行业顶会SIGMOD,被SIGMOD 2022 Research Full Paper(研究类长文)收录. 本次被收录的研究成果中,新型数据结构设 ...

随机推荐

  1. 使用 gulp-file-include 构建前端静态页面

    前言 虽然现在单页面很流行,但是在 PC 端多页面还是常态,所以构建静态页面的工具还有用武之地.最近也看到了一些询问如何 include HTML 文件的问题. 很多时候我们在写静态页面的时候也希望能 ...

  2. Codeforces 862A Mahmoud and Ehab and the MEX

    传送门:CF-862A A. Mahmoud and Ehab and the MEX time limit per test 2 seconds memory limit per test 256 ...

  3. JSP 学习笔记

    JSP 全名为Java Server Pages,中文名叫java 服务器页面,它是在传统的 HTML 页面中插入 JAVA 代码片段和 JSP 标签形成的文件. 上一篇 Servlet 中只是讲解了 ...

  4. 基于IWICImage的截图代码

    截图方式和以前一样, 用GetDC, 保存为JPG的方式改用IWICImage接口, 在我机器上 1920*1080 大概花费70毫秒左右, 比用TJPEGImage快了一倍多(TJPEGImage需 ...

  5. MVC 页面静态化

    最近工作需要,实现页面静态化,以前在ASP时代,都是FSO自己手动生成的. 新时代,MVC了,当然也要新技术,网上一搜,找到一种解决方案,是基于MVC3的,实现原理是通过mvc提供的过滤器扩展点实现页 ...

  6. C#三步实现标准事件处理程序

    事件,MSDN解释:类或对象可以通过事件向其他类或对象通知发生的相关事情.发送(或引发)事件的类称为“发行者”,接收(或处理)事件的类称为“订户”. 有关事件的理论与好处,在这里就不再废话了,感兴趣的 ...

  7. 《天书夜读:从汇编语言到windows内核编程》一 汇编指令与C语言

    1. Debug模式下,VC++6.0下断点运行,按CTRL+F11可查看汇编代码:另外可以用cl /c /FAs YourCppFile.cpp命令行在同目录生成YourCppFile.asm汇编文 ...

  8. 获取所有栈的信息,只有最上面的和最下面的,但是不能获取栈中间的activity信息

    直接在cmd窗口上输入 adb shell后,再输入dumpsys activity activities,可以看到所有的activity以及相关栈状态

  9. R语言高性能编程(二)

    接着上一篇 一.减少内存使用的简单方法1.重用对象而不多占用内存 y <- x 是指新变量y指向包含X的那个内存块,只有当y被修改时才会复制到新的内存块,一般来说只要向量没有被其他对象引用,就可 ...

  10. HTTP-FLV直播初探

    目前几种视频流的简单对比: 协议 httpflv rtmp hls dash 传输方式 http流 tcp流 http http 视频封装格式 flv flv tag Ts文件 Mp4 3gp web ...