作者介绍: 赵伟 腾讯云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)的缺陷列举

标签:log   read   包括   upd   额外   imp   dos   函数   ror

本条技术文章来源于互联网,如果无意侵犯您的权益请点击此处反馈版权投诉

本文系统来源:http://www.cnblogs.com/qcloud1001/p/6564469.html

mysql sbr_腾讯云数据库团队:MySQL语句复制(SBR)的缺陷列举相关推荐

  1. 腾讯云mysql高可用方案_腾讯云数据库团队:MySQL数据库的高可用性分析

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

  2. 阿里云mysql宽带_阿里云数据库RDS MySQL版购买使用详细过程

    阿里云数据库 RDS MySQL 版如何购买使用?通过前面学习如何选择阿里云数据库 RDS MySQL 版,魏艾斯博客已经阿里云 MySQL 有了初步认识,接下来跟着老魏一起购买使用阿里云数据库 RD ...

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

    2019独角兽企业重金招聘Python工程师标准>>> 作者介绍:吴双桥 腾讯云工程师 阅读原文,更多技术干货,请访问腾云阁. 本文主要介绍在MySQL 5.7.7开始引入的非结构化 ...

  4. 腾讯云数据库闪耀曼哈顿,CynosDB回馈开源社区

    2月27日,腾讯云数据库(TencentDB)正式亮相MariaDB用户者大会,腾讯云数据库CynosDB以其极致领先的性能.独特的技术架构以及众多内核层面的创新特性受到包括MariaDB基金会主席K ...

  5. CSDN联合腾讯云重磅发布“腾讯云数据库TDSQL工程师路线图”

    腾讯云数据库TDSQL是腾讯自研的企业级分布式数据库,在金融.政务.运营商.电商.游戏等数十个行业中落地应用,具备金融级高可用.强一致.高性能.高可靠等特性.目前,腾讯云数据库TDSQL 已助力 20 ...

  6. 腾讯云数据库开源再突破:TDSQL PG版查询性能提升百倍

    日前,腾讯云数据库开源产品TDSQL PG版(开源代号TBase)宣布推出重磅升级--经过一年半的打磨,上万张表访问场景下,内存占用节省60%:查询性能提升百倍:SQL语句兼容性增强.同时,大力提升原 ...

  7. CSDN联合腾讯云发布“腾讯云数据库TDSQL工程师路线图”

    腾讯云数据库TDSQL是腾讯自研的企业级分布式数据库,在金融.政务.运营商.电商.游戏等数十个行业中落地应用,具备金融级高可用.强一致.高性能.高可靠等特性.目前,腾讯云数据库TDSQL 已助力 20 ...

  8. TDSQL:解锁数据库前沿技术要点 | 腾讯云数据库DTCC 2021亮点回顾

    10月20日,一年一度的数据库技术交流盛会--DTCC 2021(第十二届中国数据库技术大会)在京圆满落幕. 大会以"数造未来"为主题,重点围绕数据架构.人工智能与大数据应用.传统 ...

  9. 首发速学——腾讯云数据库TDSQL(PostgreSQL版)训练营正式开营

    腾讯云TDSQL是腾讯自研的企业级分布式数据库,在金融.政务.运营商.电商.游戏等数十个行业中落地应用,具备金融级高可用.强一致.高性能.高可靠等特性.目前,腾讯云数据库TDSQL 已助力 20 余家 ...

最新文章

  1. android开发 权限大全
  2. WPF学习笔记(三)
  3. ios nslog 例子_iOS 典型内存泄露案例 - zhenshan2013的个人空间 - 51Testing软件测试网 51Testing软件测试网-软件测试人的精神家园...
  4. mysql的日期和时间函数
  5. select语句一些要点(一)
  6. 小米入住华为鸿蒙,华为鸿蒙开放,国产厂商集体失声?小米率先表态!
  7. 如何用 Linux 拨号上网
  8. tracepro应用实例详解_十大行业气动设备 120个典型气动系统应用实例
  9. java servlet配置_JavaWeb编程 Servlet的基本配置
  10. 区块链 智能合约是有状态的吗
  11. git sync fatal: Authentication failed for https://github.com/ did not exit cleanly (exit code 128)
  12. 笔记本打开计算机都特别慢,笔记本电脑网速慢怎么办_教你解决笔记本网速很慢的方法...
  13. ASP.NET2.0 ReportingServices报表灵魂的收割者(一)
  14. 自己封装工具类Jar包
  15. PS2无线遥控手柄的通讯协议以及c语言代码分析
  16. 【黑金视频连载】NIOS II视频教程(01)--软件安装
  17. GPT-4:不了不了,这些我还做不到
  18. 【div】 设置水平居中
  19. MySQL安全登录策略
  20. 25268 Problem E 例题3-5 求一元二次方程的根

热门文章

  1. SpringBoot+Swagger整合API
  2. 添加到界面前获取尺寸
  3. Skype for Business Server 2015-12-WAP-发布-1-前端服务器-OWAS01
  4. PHP Redis List [列表] 的使用
  5. java10---点餐系统
  6. 《TensorFlow技术解析与实战》——1.2 什么是深度学习
  7. 关于xendesktop外部SQL数据库连接设置的问题
  8. 反编译工具reflector破解方法
  9. linux异常级别,linux性能异常定位之进程级别
  10. mysql 文章 字段设计_在mysql数据库中,文章表设计有啥好的思路