与不同引擎的关系 核心作用 生命周期   日志类型
undo log 属于innodb引擎独有 回滚,保证事务的“原子性”,事务日志  事务开始前,以类似“快照”的方式记录现场  逻辑日志
redo log 属于innodb引擎独有 重做,保证事务的“持久性”,事务日志  事务开始后记录,prepare阶段落盘  物理日志
binlog 工作在mysql的Server层,与使用哪种引擎无关 实现主从节点数据的复制  事务执行期间记录,commit阶段完成前落盘  逻辑日志

  

  物理日志:记录的是"在某个数据页上做了什么修改"
  逻辑日志:记录的是这个语句的原始逻辑,也就是sql语句,比如"给ID=2这一行的c字段加1 "

【undo log】

  事务开始之前,将当前事务版本生成 undo log(Tips:undo log 也会产生 redo log 来保证 undo log 的可靠性)。

  事务提交之后,undo log 并不能立马被删除,而是放入待清理的链表,由 purge 线程判断是否有其它事务在使用 undo 段中表的上一个事务之前的版本信息,从而决定是否可以清理 undo log 的日志空间。

  数据库事务四大特性中有一个是 原子性 ,具体来说就是 原子性是指对数据库的一系列操作,要么全部成功,要么全部失败,不可能出现部分成功的情况

  实际上, 原子性 底层就是通过undo log实现的。undo log主要记录了数据的逻辑变化,比如一条INSERT语句,对应一条DELETE的undo log,对于每个UPDATE语句,对应一条相反的UPDATE的undo log,这样在发生错误时,就能回滚到事务之前的数据状态。例如,user表中原记录如下:

id name
1 xiaoming

  执行sql  update user set name = 'xiaohong' where id = 1; 的时候生成的undo log大概是update user set name = 'xiaoming' where id = 1;

  同时,undo log也是MVCC(多版本并发控制)实现的关键。

【redo log】

  mysql是如何保证事务的持久性的呢?最简单的做法是在每次事务提交的时候,将该事务涉及修改的数据页全部刷新到磁盘中。但是这么做会有严重的性能问题,主要体现在两个方面:

    1. 因为Innodb是以页为单位进行磁盘交互的,而一个事务很可能只修改一个数据页里面的几个字节,这个时候将完整的数据页刷到磁盘的话,太浪费资源了!

    2. 一个事务可能涉及修改多个数据页,并且这些数据页在物理上并不连续,使用随机IO写入性能太差!

  因此,mysql设计了redo log机制,并通过WAL(Write-Ahead Logging)技术进行了性能优化。WAL的核心就是先顺序IO写日志磁盘、再随机IO写数据磁盘,节省的是随机写磁盘的 IO 消耗。mysql 每执行一条 DML 语句,先将记录顺序追加写入 redo log buffer并更新内存中的数据,等到有空闲线程、内存不足、Redo Log满时再批量落盘持久化。

【binlog】

  binlog是mysql的逻辑日志并且由Server层进行记录,记录对象为任意数据库引擎的写入性操作(不包括查询)信息,以二进制的形式保存在磁盘中。

  在实际应用中,binlog的主要使用场景有两个,分别是 主从复制 和 数据恢复 。

    1. 主从复制 :在Master端开启binlog,然后将binlog发送到各个Slave端,Slave端重放binlog从而达到主从数据一致。

    2. 数据恢复 :通过使用mysqlbinlog工具来恢复数据。

  数据更新过程中,万一更新数据的过程中系统出现故障异常重启了,如何保证事务的持久性、原子性呢?概述如下:

    1. 记录此次更新前数据记录的快照现场(即写undo log)
    2. 读取此次更新所需要的数据入内存
    3. 在内存中更新数据(效率高)
    4. 写redo log,并置redo log状态为prepare
    5. 写binlog
    6. 置redo log状态为commit 

      

      基于上述简化版的undo log、redo log和binlog的写入流程,我们来梳理下原子性、持久性、一致性的可靠性保证:

        A)假如是在步骤1/2/3中任一步骤发生故障,故障恢复后发现redo log中并无未完成的记录,故障恢复后只需要回滚undo log恢复现场即可;

        B)假如在步骤4/5中任一步骤发生故障,故障恢复后发现redo log处于prepare状态,则进一步判断是否已经写入binlog:

        1. 若已经写入binlog,则重新执行redo log的相关记录直到成功达到commit状态(主从的一致性);
        2. 若未写入binlog,则回滚undo log恢复现场(原子性);       

        C)假如在步骤6发生故障,故障恢复后发现redo log处于commit状态,表示过程全部正常完成,则什么都不需要做。

Mysql的undo、redo、binlog的区别的更多相关文章

  1. MySQL日志——Undo | Redo【转】

    本文是介绍MySQL数据库InnoDB存储引擎重做日志漫游 00 – Undo LogUndo Log 是为了实现事务的原子性,在MySQL数据库InnoDB存储引擎中,还用Undo Log来实现多版 ...

  2. redo、undo、binlog的区别

    在MySQL中,redo.undo.binlog经常见,但很容易混淆这三者.   redo undo binlog 作用 保持事务的持久性 帮助事务回滚及MVCC的功能 进行Point-In-Time ...

  3. [转]MySQL日志——Undo | Redo

    本文是介绍MySQL数据库InnoDB存储引擎重做日志漫游 00 – Undo LogUndo Log 是为了实现事务的原子性,在MySQL数据库InnoDB存储引擎中,还用Undo Log来实现多版 ...

  4. 【转载】MySQL 日志 undo | redo

    本文是介绍MySQL数据库InnoDB存储引擎重做日志漫游 00 – Undo LogUndo Log 是为了实现事务的原子性,在MySQL数据库InnoDB存储引擎中,还用Undo Log来实现多版 ...

  5. MySQL日志Undo&Redo

    00 – Undo LogUndo Log 是为了实现事务的原子性,在MySQL数据库InnoDB存储引擎中,还用Undo Log来实现多版本并发控制(简称:MVCC). - 事务的原子性(Atomi ...

  6. mysql undo+redo+binlog

    rt 数据库事务开始之前,会将要修改的记录存放到UNdo日志里,当事务回滚时或数据库崩溃时,可以利用undo日志撤销未提交事务对数据库产生的影响. 逻辑日志,记录一个过程,提交后不会删除.delete ...

  7. MySQL的undo/redo日志和binlog日志,以及2PC

    发现自己的知识点有点散,今天就把它们连接起来,好好总结一下. 一.undo log.redo log.binlog的定义和对比   定义和作用                       所在架构层级 ...

  8. 【MySQL】undo,redo,2PC,恢复思维导图

    http://blog.itpub.net/22664653/viewspace-2131353/

  9. 数据库篇:mysql日志类型之 redo、undo、binlog

    前言 可以说mysql的多数特性都是围绕日志文件实现,而其中最重要的有以下三种 redo 日志 undo 日志 binlog 日志 关注公众号,一起交流:微信搜一搜: 潜行前行 1 redo日志 in ...

随机推荐

  1. 微信小程序云开发-云存储-上传文件(word/excel/ppt/pdf)到云存储

    说明 word/excel/ppt/pdf是从客户端会话选择文件.使用chooseMessageFile中选择文件. 一.wxml文件 上传按钮,绑定chooseFile <!--上传文件(wo ...

  2. Java 将Word转为Tiff

    本文以Java代码示例展示如何将Word文档转换为Tiff格式.代码方法比较简单,加载Word文档,并通过saveToTiff(tiffFilename)方法直接保存为tiff格式即可. 1.Java ...

  3. mysql免安装版下载及安装教程

    第一步:下载 下载地址:http://dev.mysql.com/downloads/mysql/ 点击图中红色箭头Archives,可以下载自己想要的mysql版本,如图: 下载后解压,放在自己想要 ...

  4. POJ3667 Hotel 题解

    和最大子段和的思路是一样的,可以记 \(lmax,rmax,dat\) 分别表示从当前区间最靠左/右的最大连续空子段和当前区间的最大连续空子段. 需要用延迟标记,每次遇到开房操作先ask,如果能找到就 ...

  5. P4778 Counting Swaps 题解

    第一道 A 掉的严格意义上的组合计数题,特来纪念一发. 第一次真正接触到这种类型的题,给人感觉好像思维得很发散才行-- 对于一个排列 \(p_1,p_2,\dots,p_n\),对于每个 \(i\) ...

  6. 警告: Runner org.junit.internal.runners.ErrorReportingRunner (used on class cn.star.MybatisTest)

    bug描述: 在Springboot整合Junit的时候编写测试类进行测试时, 出现以下错误: 十一月 28, 2019 2:53:48 下午 org.junit.vintage.engine.des ...

  7. 构建后端第6篇之---java 多态的本质 父类引用 指向子类实现

    张艳涛写于2021-2-20 今天来个破例了,不用英文写了,今天在家里电脑写的工具不行,简单的说 主题是:java多态的原理与实现 结论是:java的多态 Father father= new Son ...

  8. centos7网卡配置文件

    HWADDR=00:0c:29:a7:8e:ee TYPE=Ethernet BOOTPROTO=staticDEFROUTE=yes PEERROUTES=yesPEERROUTES=yes IPV ...

  9. 数据结构与算法 java描述 第一章 算法及其复杂度

    目录 数据结构与算法 java描述 笔记 第一章 算法及其复杂度 算法的定义 算法性能的分析与评价 问题规模.运行时间及时间复杂度 渐进复杂度 大 O 记号 大Ω记号 Θ记号 空间复杂度 算法复杂度及 ...

  10. js原始数据类型有哪些,引用数据类型有哪些

    js的数据类型划分方式为 原始数据类型和 引用数据类型 栈: 原始数据类型(Undefined,Null,Boolean,Number.String) 堆: 引用数据类型(对象.数组.函数) 两种类型 ...