1 redo log 和 binlog 的区别

  1. redo log 是 InnoDB 引擎特有的;binlog 是 MySQL 的 Server 层实现的,所有引擎都可以使用。
  2. redo log 是物理日志,记录的是“在某个数据页上做了什么修改,实现 crash-safe,即使数据库发生异常重启,之前提交的记录都不会丢失。而 binlog 是逻辑日志,记录的是写入性操作(不包括查询)信息,比如“给 ID=5 这一行的 c 字段加 1 ”,保证数据的一致性。
  3. redo log 是循环写的,空间固定会用完;binlog 是可以追加写入的。“追加写”是指 binlog 文件写到一定大小后会切换到下一个,并不会覆盖以前的日志。
  4. binlog 仅在事务提交时记录,并且对于每一个事务,仅包含对应事务的一个日志。而对于 redo log,由于其记录的是物理操作日志,因此每个事务对应多个日志条目。

2 redo log 和 binlog 的相同点

redo log 和 binlog 落盘的步骤是差不多的,都分为三部分。

  1. 将日志写入 log buffer 和 binlog cache。
  2. 将上述的内容写入操作系统的 file system page cache。
  3. 由操作系统将文件缓存中的数据写入到磁盘中。

3 redo log 的两阶段提交

对数据进行修改后,需要写入 redo log 和 binlog,那么这势必存在一个先后顺序,假设执行过程中写完 redo log 日志后,binlog 日志写期间发生了异常,会发生什么?

由于 binlog 没写完就异常,这时候 binlog 里面没有对应的修改记录。从机用 binlog 日志更新数据时,就会少这次更新,而主机用 redo log 日志恢复,会导致最终数据不一致的情况。

为了解决两份日志之间的逻辑一致问题,InnoDB 使用两阶段提交方案,将 redo log 的写入拆成 prepare 和 commit 两阶段。

在数据库发生崩溃重启后,它将会去检查 redo log:

  1. 如果 redo log 有 commit 标识则直接提交事务。
  2. 如果 redo log 没有 commit 标识且不存在对应的完整 binlog,则回滚事务。redo log 和 binlog 有一个共同的数据字段,叫XID。崩溃恢复的时候,redo log 会拿着 XID 去 binlog 找对应的事务。
  3. 如果 redo log 没有 commit 标识且存在对应的完整 binlog,说明在 commit 阶段发生了崩溃,此时实际上 redo log 和 binlog 都已经完整写入,可以提交事务。

4 为什么不能用 binlog 进行崩溃恢复

由于 binlog 记录的是写入性操作,如果想用 binlog 来恢复数据,我们必须知道现在得从哪里开始,因为一条语句多执行几次会带来数据上的错误。但是 binlog 虽然保存了所有的历史操作,但是它没有标识每条操作是否已经写入磁盘,所以我们确定从哪开始。

而 redo log 记录的是数据页的更改,并且刷盘完成的数据会从 redo log 中删除。

References:

  1. MySQL 实战 45 讲
  2. MySQL各种“Buffer”之Log Buffer

redo log 和 binlog 的一些总结的更多相关文章

  1. MySQL日志系统:redo log与binlog

    日志系统主要有redo log(重做日志)和binlog(归档日志).redo log是InnoDB存储引擎层的日志,binlog是MySQL Server层记录的日志, 两者都是记录了某些操作的日志 ...

  2. MySQL redo log 与 binlog 的区别

    MySQL redo log 与 binlog 的区别 什么是redo log 什么是binlog redo log与binlog的区别 1. 什么是redo log? redo log又称重做日志文 ...

  3. MySQL 日志系统之 redo log 和 binlog

    之前我们了解了一条查询语句的执行流程,并介绍了执行过程中涉及的处理模块.一条查询语句的执行过程一般是经过连接器.分析器.优化器.执行器等功能模块,最后到达存储引擎. 那么,一条 SQL 更新语句的执行 ...

  4. 数据库中的两个最重要的日志redo log和binlog

    mysql整体来看其实只有两部分,一部分是server层,一部分是引擎层. 1.redo log(重做日志):当有一条记录需要更新的时候,InnoDB 引擎就会先把记录写入redo log里面,并更新 ...

  5. redo log 与 binlog

    redo log 与 binlog   redo log redo log (重做日志)是处于存储引擎层的,是InnoDB引擎特有的 redo log 存储的是物理日志 --- 即,"在某个 ...

  6. msyql redo log和binlog

    更新语句执行流程 下面是这个表的创建语句,这个表有一个主键 ID 和一个整型字段 c: create table T(ID int primary key, c int); 如果要将 ID=2 这一行 ...

  7. 一生挚友redo log、binlog《死磕MySQL系列 二》

    系列文章 原来一条select语句在MySQL是这样执行的<死磕MySQL系列 一> 一生挚友redo log.binlog<死磕MySQL系列 二> 前言 咔咔闲谈 上期根据 ...

  8. MySQL更新数据时,日志(redo log、binlog)执行流程

    1:背景 项目需要做Es和数据库的同步,而手动在代码中进行数据同步又是Es的一些不必要的数据同步操作和业务逻辑耦合,所以使用的了读取mysql的binlog日志的方式进行同步Es的数据. 问题1:根据 ...

  9. MySQL是怎么保证redo log和binlog是完整的?

    摘要:WAL机制保证只要redo log和binlog保证持久化到磁盘,就能确保MySQL异常重启后,数据可以恢复. 本文分享自华为云社区<MySQL会丢数据吗?>,作者: JavaEdg ...

随机推荐

  1. JVM-learning

    JVM是什么?? Java Virtual Mechine JRE(JavaRuntimeEnvironment,Java运行环境),也就是Java平台.所有的Java 程序都要在JRE下才能运行. ...

  2. memcached 能接受的 key 的最大长度是多少?

    key 的最大长度是 250 个字符.需要注意的是,250 是 memcached 服务器端内 部的限制,如果您使用的客户端支持"key 的前缀"或类似特性,那么 key(前缀 + ...

  3. react开发教程(三)组件的构建

    什么是组件 组件化就好像我们的电脑装机一样,一个电脑由显示器.主板.内存.显卡.硬盘,键盘,鼠标.... 组件化开发有如下的好处:降低整个系统的耦合度,在保持接口不变的情况下,我们可以替换不同的组件快 ...

  4. VueJs单页应用实现微信网页授权及微信分享功能

    在实际开发中,无论是做PC端.WebApp端还是微信公众号等类型的项目的时候,或多或少都会涉及到微信相关的开发,最近公司项目要求实现微信网页授权,并获取微信用户基本信息的功能及微信分享的功能,现在总算 ...

  5. java中的方法(method)到底怎么用?给个例子

    7.方法(method)   被调例子, int add(int x, int y){ return x+y; } 主调例子, for example: int result = add(5,3); ...

  6. mixin和composition api

    1. 这两个都是实现组件逻辑复用的法宝 2. composition api是vue3的,  composition api的出现就是解决mixins的不足之处的 一. mixin 回顾下mixin, ...

  7. Python 图_系列之基于<链接表>实现无向图最短路径搜索

    图的常用存储方式有 2 种: 邻接炬阵 链接表 邻接炬阵的优点和缺点都很明显.优点是简单.易理解,对于大部分图结构而言,都是稀疏的,使用炬阵存储空间浪费就较大. 链接表的存储相比较邻接炬阵,使用起来更 ...

  8. Jenkins 脚本命令行应用总结

    Jenkins脚本命令行应用总结 测试环境 Jenkins 2.304 脚本命令行入口 Jenkins主页→系统管理→脚本命令行 遍历项目 例子:获取所有自由风格项目及相关项目信息 def proje ...

  9. Linux---必备命令(2)

    进程相关命令 # 查看系统所有的进程 ps -ef ps -ef | grep vim # 过滤出vim有关的进程 ps -ef | grep vim # 过滤出22端口的信息 ps -tunlp | ...

  10. Java基础之浅谈泛型

    简单的介绍了Java泛型类型的使用.上手容易,深入很难.