美文网首页MySQL
mysql中binlog的底层原理分析

mysql中binlog的底层原理分析

作者: 康俊1024 | 来源:发表于2019-04-23 23:26 被阅读18次

概述

binlog记录数据更新或者潜在更新(delete from table where id=x)
主从复制就是依靠binlog;master - slave

类型

  • statement:基于sql语句 (insert update delete)
  • row:基于行模式。update table set value=x;1000条 记录1000条变更的数据
  • mixed:混合模式


    主从复制.png

扩展

互联网项目中mysql应该选什么事务隔离级别

mysql事务隔离级别

读未提交,读已提交,可重复读,串行化(默认是可重复读)

思考

在Oracle,SqlServer中都是选择读已提交(Read Commited)作为默认的隔离级别,为什么Mysql不选择读已提交(Read Commited)作为默认隔离级别,而选择可重复读(Repeatable Read)作为默认的隔离级别呢?

解答

那Mysql在5.0这个版本以前,binlog只支持STATEMENT这种格式!而这种格式在读已提交(Read Commited)这个隔离级别下主从复制是有bug的,因此Mysql将可重复读(Repeatable Read)作为默认的隔离级别
当binlog为STATEMENT格式,且隔离级别为读已提交(Read Commited)时,有什么bug呢?如下图所示,在主(master)上执行如下事务


事务操作.png

出现主从不一致性的问题!原因就是在master上执行的顺序为先删后插!而此时binlog为STATEMENT格式,它记录的顺序为先插后删!从(slave)同步的是binglog,因此从机执行的顺序和主机不一致!就会出现主从不一致!

解决方案
  • 隔离级别设为可重复读(Repeatable Read),在该隔离级别下引入间隙锁。当Session 1执行delete语句时,会锁住间隙。那么,Ssession 2执行插入语句就会阻塞住!
  • 将binglog的格式修改为row格式,此时是基于行的复制,自然就不会出现sql执行顺序不一样的问题!奈何这个格式在mysql5.1版本开始才引入。因此由于历史原因,mysql将默认的隔离级别设为可重复读(Repeatable Read),保证主从复制不出问题!

相关文章

  • 数据库

    1.mysql binlog的底层原理分析

  • mysql中binlog的底层原理分析

    概述 binlog记录数据更新或者潜在更新(delete from table where id=x)主从复制就是...

  • MySQL之binlog底层原理分析

    最近在准备看MySQL相关的内容,简单的整理一下binlog的原理,加深理解。 binlog基本认识 MySQL中...

  • cannal使用

    a. canal的原理是基于mysql binlog技术,所以这里一定需要开启mysql的binlog写入功能,建...

  • MySQL搭建主从复制

    1.1 主从复制原理 1.2 binlog介绍和relay日志 查看binlog日志: mysql****bin...

  • MySQL如何开启binlog?binlog三种模式的分析

    MySQL如何开启binlog?binlog三种模式的分析 前提,创建表t,并插入数据,语句如下: 判断MySQL...

  • linux mysql 安装

    建用户组和用户 下载 启动mysql 将mysql加入到服务中 开机启动 分析binlog 日志

  • 无标题文章

    1、MySQL中binlog的实现原理 2、kafka为什么这么快 3、dubbo中的标签解析 4、spring的...

  • MySQL binlog 原理

    一、介绍 MySQL的二进制日志可以说是MySQL最重要的日志了,它记录了所有的DDL和DML(除了数据查询语句)...

  • 99 MySQL性能实战优化

    mysql 性能优化 一 MySQL架构与执行流程原理 二 MySQL 索引底层实现原理 三 MYSQL事务...

网友评论

    本文标题:mysql中binlog的底层原理分析

    本文链接:https://www.haomeiwen.com/subject/gijigqtx.html