作者介绍: 赵伟 腾讯云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. vue 2 仿IOS 滚轮选择器 从入门到精通 (一)

    大家好,由于最近从事的是微信公众号和APP内嵌 H5开发,避免不了开发一些和native相同的操作功能,就如接下来说的 仿IOS滚轮选择器. 先来个截图: 接下来具体介绍如何实现的.能力有限避免不了错 ...

  2. android wear开发之:创建可穿戴设备应用 - Creating Wearable Apps

    注:本文内容来自:https://developer.android.com/training/wearables/apps/index.html 翻译水平有限,如有疏漏,欢迎批评指教. 译:山人 创 ...

  3. JS获取DOM元素

    1.childNodes:获取节点,不同浏览器表现不同: IE:只获取元素节点: 非IE:获取元素节点与文本节点: 解决方案:if(childNode.nodeName=="#text&qu ...

  4. C#只能运行一个实例程序的方法

    互斥进程(程序), 简单点说,就是在系统中只能有该程序的一个实例运行. 现在很多软件都有这功能,如Maxthon 可以设置为"只允许打开一个窗体",还有Bitcomet等. 我也是 ...

  5. C# 扩展方法使用

    为指定类型扩展方法: 定义类Class1: public static class Class1                                  //必须为static类,且不能包含 ...

  6. vim7.3中文乱码问题

    在测试机安装vim7.3之后编辑中文文本出现乱码问题. vim在编译安装的时候: ./configure --enable-gdb --enable-multibyte --enable-cscope ...

  7. 运行第一个 Service - 每天5分钟玩转 Docker 容器技术(96)

    上一节我们创建好了 Swarm 集群, 现在部署一个运行 httpd 镜像的 service,执行如下命令: docker service create --name web_server httpd ...

  8. Angular i18n的技术分享、踩过的坑

    1.安装 npm @ngx-translate/core --save npm @ngx-translate/http-loader 2.配置(文本背景部分为该模块新增的)~app.module.ts ...

  9. Linux系列教程(二十四)——Linux的系统管理

    上篇博客介绍了Linux的服务管理,不管是以RPM包安装的服务,还是通过源码包安装的服务,万能启动服务的方法都可以通过 /绝对路径/启动脚本名 start .而通过 RPM 包安装的服务还可以通过 s ...

  10. Redis 快速入门

    Redis 快速入门 谈到Redis,大家应该都不陌生.它是用c语言开发的一个高性能键值数据库,主要用于缓存领域.本章通过Redis的安装,Redis的五大数据类型,Redis的Java客户端,Red ...