Mysql的undo、redo、binlog的区别
| 与不同引擎的关系 | 核心作用 | 生命周期 | 日志类型 | |
| undo log | 属于innodb引擎独有 | 回滚,保证事务的“原子性”,事务日志 | 事务开始前,以类似“快照”的方式记录现场 | 逻辑日志 |
| redo log | 属于innodb引擎独有 | 重做,保证事务的“持久性”,事务日志 | 事务开始后记录,prepare阶段落盘 | 物理日志 |
| binlog | 工作在mysql的Server层,与使用哪种引擎无关 | 实现主从节点数据的复制 | 事务执行期间记录,commit阶段完成前落盘 | 逻辑日志 |
【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是如何保证事务的持久性的呢?最简单的做法是在每次事务提交的时候,将该事务涉及修改的数据页全部刷新到磁盘中。但是这么做会有严重的性能问题,主要体现在两个方面:
因为Innodb是以页为单位进行磁盘交互的,而一个事务很可能只修改一个数据页里面的几个字节,这个时候将完整的数据页刷到磁盘的话,太浪费资源了!
一个事务可能涉及修改多个数据页,并且这些数据页在物理上并不连续,使用随机IO写入性能太差!
因此,mysql设计了redo log机制,并通过WAL(Write-Ahead Logging)技术进行了性能优化。WAL的核心就是先顺序IO写日志磁盘、再随机IO写数据磁盘,节省的是随机写磁盘的 IO 消耗。mysql 每执行一条 DML 语句,先将记录顺序追加写入 redo log buffer并更新内存中的数据,等到有空闲线程、内存不足、Redo Log满时再批量落盘持久化。
【binlog】
binlog是mysql的逻辑日志并且由Server层进行记录,记录对象为任意数据库引擎的写入性操作(不包括查询)信息,以二进制的形式保存在磁盘中。
在实际应用中,binlog的主要使用场景有两个,分别是 主从复制 和 数据恢复 。
主从复制 :在Master端开启binlog,然后将binlog发送到各个Slave端,Slave端重放binlog从而达到主从数据一致。
数据恢复 :通过使用mysqlbinlog工具来恢复数据。
数据更新过程中,万一更新数据的过程中系统出现故障异常重启了,如何保证事务的持久性、原子性呢?概述如下:
- 记录此次更新前数据记录的快照现场(即写undo log)
- 读取此次更新所需要的数据入内存
- 在内存中更新数据(效率高)
- 写redo log,并置redo log状态为prepare
- 写binlog
- 置redo log状态为commit

基于上述简化版的undo log、redo log和binlog的写入流程,我们来梳理下原子性、持久性、一致性的可靠性保证:
A)假如是在步骤1/2/3中任一步骤发生故障,故障恢复后发现redo log中并无未完成的记录,故障恢复后只需要回滚undo log恢复现场即可;
B)假如在步骤4/5中任一步骤发生故障,故障恢复后发现redo log处于prepare状态,则进一步判断是否已经写入binlog:
- 若已经写入binlog,则重新执行redo log的相关记录直到成功达到commit状态(主从的一致性);
- 若未写入binlog,则回滚undo log恢复现场(原子性);
C)假如在步骤6发生故障,故障恢复后发现redo log处于commit状态,表示过程全部正常完成,则什么都不需要做。
Mysql的undo、redo、binlog的区别的更多相关文章
- MySQL日志——Undo | Redo【转】
本文是介绍MySQL数据库InnoDB存储引擎重做日志漫游 00 – Undo LogUndo Log 是为了实现事务的原子性,在MySQL数据库InnoDB存储引擎中,还用Undo Log来实现多版 ...
- redo、undo、binlog的区别
在MySQL中,redo.undo.binlog经常见,但很容易混淆这三者. redo undo binlog 作用 保持事务的持久性 帮助事务回滚及MVCC的功能 进行Point-In-Time ...
- [转]MySQL日志——Undo | Redo
本文是介绍MySQL数据库InnoDB存储引擎重做日志漫游 00 – Undo LogUndo Log 是为了实现事务的原子性,在MySQL数据库InnoDB存储引擎中,还用Undo Log来实现多版 ...
- 【转载】MySQL 日志 undo | redo
本文是介绍MySQL数据库InnoDB存储引擎重做日志漫游 00 – Undo LogUndo Log 是为了实现事务的原子性,在MySQL数据库InnoDB存储引擎中,还用Undo Log来实现多版 ...
- MySQL日志Undo&Redo
00 – Undo LogUndo Log 是为了实现事务的原子性,在MySQL数据库InnoDB存储引擎中,还用Undo Log来实现多版本并发控制(简称:MVCC). - 事务的原子性(Atomi ...
- mysql undo+redo+binlog
rt 数据库事务开始之前,会将要修改的记录存放到UNdo日志里,当事务回滚时或数据库崩溃时,可以利用undo日志撤销未提交事务对数据库产生的影响. 逻辑日志,记录一个过程,提交后不会删除.delete ...
- MySQL的undo/redo日志和binlog日志,以及2PC
发现自己的知识点有点散,今天就把它们连接起来,好好总结一下. 一.undo log.redo log.binlog的定义和对比 定义和作用 所在架构层级 ...
- 【MySQL】undo,redo,2PC,恢复思维导图
http://blog.itpub.net/22664653/viewspace-2131353/
- 数据库篇:mysql日志类型之 redo、undo、binlog
前言 可以说mysql的多数特性都是围绕日志文件实现,而其中最重要的有以下三种 redo 日志 undo 日志 binlog 日志 关注公众号,一起交流:微信搜一搜: 潜行前行 1 redo日志 in ...
随机推荐
- Lesson 11 Not guilty
Lesson 11 Not guilty guilty ['gɪlti] adj. 有罪的:内疚的 be guilty of - He is guilty of murder. be innocent ...
- windows安装Laravel框架经验心得(一)
作为一个程序员,要活到老学到老.虽然自己水平很菜,但是也要继续往前走,所以打算利用一些空闲时间在学习一些新知识,比如Laravel框架. 看书费劲,好不容易找到了一些关于Laravel的教学视频.不过 ...
- Ubuntu 20.04 安装kodi播放器
打开终端,执行命令在线安装 sudo apt-get install software-properties-common sudo add-apt-repository ppa:team-xbmc/ ...
- JavaScript关于对象的一些小知识
javascript的对象 javascriot(之后用js代替)中基本数据类型之一,是复合类型的数据. 对象在js中应用十分广泛,几乎所有的的事物都是做对象,js的对象拥有自己的属性和方法的数据 在 ...
- 01MATLAB导论
MATLAB语言的主要功能 数值计算 符号计算 图形绘制 程序流程控制 工具箱 课程的学习目标 要求理解MATLAB功能实现的数学背景与算法原理 掌握利用MATLAB进行问题求解的基本规律 能够利用M ...
- ifix 自动化(Automation)错误弹窗的解决方案
在先前ifix项目中添加了语音模块,然后概率性跳出自动化(Automation)错误弹窗,先前分析了很多种原因,从代码的冗余,编码等角度进行了优化,效果不是很理想,仍然会概率性出现.经过反反复复大约3 ...
- msf反弹
转载https://www.cnblogs.com/xishaonian/p/7721584.html msf 生成反弹 Windows Shell msfvenom -p windows/meter ...
- kms激活windows或者office
激活windows和office windows激活密钥 Windows 10 Professional(专业版):W269N-WFGWX-YVC9B-4J6C9-T83GX Windows 10 P ...
- TypeScript学习笔记(一)环境搭建和数据类型
目录 一.学习TypeScript的缘由 二.学习环境的搭建 1. TypeScript的编译环境 2. vscode自动编译的配置 三.TypeScript中的数据类型 1. 简单变量的定义和初始化 ...
- 建立安全SSL连接PostgreSQL数据库服务器
建立安全SSL连接PostgreSQL数据库服务器当前物联网的挑战之一就是提供最高的安全级别.这就是为什么需要开启SSL连接到 PostgreSQL. 当你想要安全的存储数据到PostgreSQL数据 ...