【Mysql】三大日志 redo log、bin log、undo log
@
redo log(物理日志\重做日志)
redo log是InnoDB存储引擎层的日志,又称重做日志文件,是物理日志。redo log记录数据修改后新数据的备份、冗杂的undo log、未提交的事务和回滚的事务,数据缓存到内存中,只是在事务提交前将redo log持久化到磁盘
redo log可以保证即使数据库发生异常重启,之前提交的记录都不会丢失,保证了事务的持久性。当有一条记录需要更新的时候,InnoDB引擎就会先把记录写到
redo log中,并更新内存。之后,InnoDB引擎会在适当的时候,将这个操作更新到磁盘中,这个更新是在系统比较空闲的时候做,他的关键点是先写日志,再写磁盘。
redo log日志大小是固定的,若空间满了以后会回到头部停止更新,先加载一些数据到磁盘让出文件空间,之后继续写入
物理日志:因为
mysql数据最终是保存在数据页中的,物理日志记录的就是数据页变更。
为了保证Redo Log能够有比较好的IO性能,InnoDB 的 Redo Log的设计有以下几个特点:
尽量保持
Redo Log存储在一段连续的空间上。因此在系统第一次启动时就会将日志文件的空间完全分配。以顺序追加的方式记录Redo Log,通过顺序IO来改善性能。redo log包括两部分:一是内存中的日志缓冲(redo log buffer),该部分日志是易失性的;二是磁盘上的重做日志文件(redo log file),该部分日志是持久的。日志并不是直接写入文件的,而是先写入日志缓冲,当需要将日志刷新到磁盘时(如事务提交),将许多日志一起写入磁盘.
并发的事务共享
Redo Log的存储空间,它们的Redo Log按语句的执行顺序,依次交替的记录在一起,以减少日志占用的空间。所以,当一个事务将Redo Log写入磁盘时,也会将其他未提交**的事务的日志写入磁盘。Redo Log上只进行顺序追加的操作,当一个事务需要回滚时,它的Redo Log记录也不会从Redo Log中删除掉。
注意:
一般在事务提交之前会将redo log持久化到磁盘中,以此来保证持久性
binlog(逻辑日志/归档日志)
binlog是属于MySQL Server层面的,又称为归档日志,属于逻辑日志,是以二进制的形式记录的是这个语句的原始逻辑,依靠binlog是没有CrashSafe能力的
逻辑日志:可以简单理解为记录的就是sql语句。
binlog主要使用场景:主从复制,数据恢复
主从复制:在Master端开启binlog,然后将binlog发送到各个Slave端,Slave端重放binlog从而达到主从数据一致。
数据库恢复方法
系统会定期整库备份,binlog会记录所有的逻辑操作,当需要恢复到指定的某一时刻时:
- 首先,找到最近的一次全量备份
- 然后,从备份时间开始,将binlog依次取出来,一直重放到指定的时刻
为什么 redo log 具有 crash-safe 的能力,而 binlog 没有?
CrashSafe指MySQL服务器宕机重启后,能够保证:
- 所有已经提交的事务的数据仍然存在。
- 所有没有提交的事务的数据自动回滚。
当数据库 crash(崩溃) 后,想要恢复未刷盘但已经写入 redo log 和 binlog 的数据到内存时,binlog 是无法恢复的。虽然 binlog 拥有全量的日志,但没有一个标志让 innoDB 判断哪些数据已经刷盘,哪些数据还没有。
但 redo log 不一样,只要刷入磁盘的数据,都会从 redo log 中抹掉,数据库重启后,直接把 redo log 中的数据都恢复至内存就可以了。这就是为什么 redo log 具有crash-safe的能力,而binlog 不具备。
redo log 和 binlog的区别:
- redo log是InnoDB特有的日志,binlog 所有引擎都可以使用
- redo log是物理日志,记录的是该数据页更新的内容;
binlog是逻辑日志,记录的是这个更新语句的原始逻辑 - redo log是循环写的,空间固定会用完。binlog是可以追加写的,当binlog写到一定大小会切换到下一个,并不会覆盖以前的日志
- binlog可以作为恢复数据使用,主从复制搭建,redo log作为异常宕机或者介质故障后的数据恢复使用。
update语句执行流程
首先进行sql查询语句的执行流程,如需 update ID = 2 ,先找到这一行,执行以下流程:

为什么update语句 要有两阶段提交?
这是为了让两份日志之间的逻辑一致。
当执行update语句时,数据修改完更新到内存,先写redo log 并设置redo log为准备阶段,再写binlog,写完binlog设置为redo log为结束阶段。两个中间有一个写入差错,那么该操作都是失败,即redo log发现只有准备阶段没有结束,那么会将该条事务进行回滚。
假如不采用两阶段提交机制的话那么会有什么影响呢?
(1)先写redo log:当写完redo log设备断电,binlog没有记录,那么数据库刚刚启动之后通过redo log可以恢复到断电前的状态,但是由于binlog没有写入,当从某个节点进行恢复时(或者创建一个备份库),那么binlog没用这条记录,恢复出来的数据库是有错误的。
(2)先写binlog:当写完binlog设备断电,redo log没有记录,还没有写入磁盘,那么数据库重新启动之后通过redo log恢复并没有这条数据,而当从某个时间点进行恢复(或者创建一个备份库)时,binlog有相关数据,所以会导致数据不统一。
Uodolog(回滚日志/重做日志)
Undo Log 是为了实现事务的原子性,事务中执行失败,进行回滚,在MySQL数据库 InnoDB 存储引擎中,还用Undo Log来实现多版本并发控制(简称:MVCC)。由引擎层的InnoDB引擎实现,是逻辑日志,记录数据修改被修改前的值。
原理:
Undo Log的原理很简单,为了满足事务的原子性,在操作任何数据之前,首先将数据备份到Undo Log。然后进行数据的修改。如果出现了错误或者用户执行了ROLLBACK语句,系统可以利用Undo Log中的备份将数据恢复到事务开始之前的状态。
回滚时机?
- 用户调用 rollback 主动回滚
- 事务出错
- 辅助 redo log 实现事务持久性
当事务提交的时候,innodb不会立即删除undo log,因为后续还可能会用到undo log,如隔离级别为repeatable read时,事务读取的都是开启事务时的最新提交行版本,只要该事务不结束,该行版本就不能删除,即undo log不能删除。
但是在事务提交的时候,会将该事务对应的undo log放入到删除列表中,未来通过purge来删除。并且提交事务时,还会判断undo log分配的页是否可以重用,如果可以重用,则会分配给后面来的事务,避免为每个独立的事务分配独立的undo log页而浪费存储空间和性能。
undo log+redo log保证持久性
除了可以保证事务的原子性,Undo Log也可以用来辅助完成事务的持久化,如数据库异常之后的恢复机制。
因为未提交的事务和回滚了的事务也会记录在Redo Log,因此在进行恢复时,这些事务要进行特殊的的处理。有2种不同的恢复策略:
A. 进行恢复时,只重做已经提交了的事务。
B. 进行恢复时,重做所有事务包括未提交的事务和回滚了的事务。然后通过Undo Log回滚那些未提交的事务。
MySQL数据库InnoDB存储引擎使用了B策略,InnoDB存储引擎中的恢复机制有几个特点:
Undo Log回滚那些未提交的事务,被回滚了的事务在恢复时先
redo再undo,也不会破坏数据的一致性 必须要在写
Redo Log之前将对应的Undo Log写入磁盘。为了降低复杂度,InnoDB将Undo Log看作数据,因此记录Undo Log的操作也会记录到redo log中。这样undo log就可以象数据一样缓存起来,而不用在redo log之前写入磁盘了。
参考:
极客时间 mysql45讲
https://www.qiancheng.me/post/coding/mysql-001
说说MySQL中的Redo log Undo log都在干啥 - 苏家小萝卜 - 博客园 (cnblogs.com)
详细分析MySQL事务日志(redo log和undo log) - 骏马金龙 - 博客园 (cnblogs.com)
【Mysql】三大日志 redo log、bin log、undo log的更多相关文章
- 详细分析MySQL事务日志(redo log和undo log)
innodb事务日志包括redo log和undo log.redo log是重做日志,提供前滚操作,undo log是回滚日志,提供回滚操作. undo log不是redo log的逆向过程,其实它 ...
- 详细分析MySQL事务日志(redo log和undo log) 表明了为何mysql不会丢数据
innodb事务日志包括redo log和undo log.redo log是重做日志,提供前滚操作,undo log是回滚日志,提供回滚操作. undo log不是redo log的逆向过程,其实它 ...
- 【MySQL (六) | 详细分析MySQL事务日志redo log】
Reference: https://www.cnblogs.com/f-ck-need-u/archive/2018/05/08/9010872.html 引言 为了最大程度避免数据写入时 IO ...
- MySQL必知必会:简介undo log、truncate、以及undo log如何帮你回滚事物
目录 一.前言 二.undo log表空间 三.关于undo log默认的配置 四.如何将undo log放到单独的表空间 文章公众号首发,持续更新中 五.rollback segment 六.什么是 ...
- MySQL学习总结:提问式回顾 undo log 相关知识
原文链接:MySQL学习总结:提问式回顾 undo log 相关知识 1.redo 日志支持恢复重做,那么如果是回滚事务中的操作呢,也会有什么日志支持么? 也回滚已有操作,那么就是想撤销,对应的有撤销 ...
- 必须了解的mysql三大日志-binlog、redo log和undo log
日志是 mysql 数据库的重要组成部分,记录着数据库运行期间各种状态信息.mysql日志主要包括错误日志.查询日志.慢查询日志.事务日志.二进制日志几大类.作为开发,我们重点需要关注的是二进制日志( ...
- 女朋友说:你要搞懂了MySQL三大日志,我就让你嘿嘿嘿!
1. 背景 MySQL实现事务.崩溃恢复.集群的主从复制,底层都离不开日志,所以日志是MySQL的精华所在.只有了解MySQL日志,才算是彻底搞懂MySQL. 今天一灯就带你深入浅出的学习MySQL的 ...
- MySQL日志系统bin log、redo log和undo log
MySQL日志系统bin log.redo log和undo log 今人不见古时月,今月曾经照古人. 简介:日志是MySQL数据库的重要组成部分,记录着数据库运行期间各种状态信息,主要包括错误日 ...
- MySQL中的redo log和undo log
MySQL中的redo log和undo log MySQL日志系统中最重要的日志为重做日志redo log和归档日志bin log,后者为MySQL Server层的日志,前者为InnoDB存储引擎 ...
随机推荐
- CAD/DWG图Web网页可视化技术之栅格和矢量瓦片
背景 在上一篇博文中CAD图DWG解析WebGIS可视化技术分析总结提到,实现CAD/DWG图形Web展示的思路一般为解析AutoCAD图形格式,然后转成html5所能绘制的格式如svg,geojso ...
- 其他css属性和特性
其他css属性和特性 设置元素的颜色和透明度 下表列出了这些属性. 颜色相关属性 属 性 说 明 值 color 设置元素的前景色 <颜色> opacity 设置颜色的透明度 <数值 ...
- spring boot log4j2 最佳实践
为什么选择 log4j2 Log4j2 使用了 LMAX Disruptor 库.在多线程场景中,异步 Logger 的吞吐量比 Log4j 1.x 和 Logback 高 18 倍,延迟低几个数量级 ...
- SharkCTF2021 The_nature_of_the_human
(信安数基的quiz1写不出来 来这放题解泄愤) crypto类题. 题面 其加密的大致过程是,对明文flag中的逐个字符,随机使用三种加密方式: 第一种,对该字符进行sha256加密后以16进制形式 ...
- Java:NIO 学习笔记-2
Java:NIO 学习笔记-2 上一篇 NIO 学习笔记-1 看了 尚硅谷 的相应教程,此处又对比看了 黑马程序员 的课程 JAVA通信架构I/O模式,做了相应的笔记 前言 在 Java 的软件设计开 ...
- 树链剖分好(du)题(liu)选做
1.luogu P4315 月下"毛景树" 题目链接 前言: 这大概是本蒟蒻A掉的题里面码量最大的一道题了.我自认为码风比较紧凑,但还是写了175行. 从下午2点多调到晚上8点.中 ...
- 零基础小白要如何跟好的学习嵌入式Linux(转)
作为一个新人,怎样学习嵌入式Linux?被问过太多次,特写这篇文章来回答一下. 在学习嵌入式Linux之前,肯定要有C语言基础.汇编基础有没有无所谓(就那么几条汇编指令,用到了一看就会). C语言要学 ...
- Codeforces Round #741 (Div. 2)部分题题解
我果然还是太菜了,就写了两道题....真是水死了.... A The Miracle and the Sleeper 简化题意:给定\(l,r\),求\(a\)%\(b\)的最大值,其中\(r> ...
- 一步一步学ROP之linux_x86篇(蒸米spark)
目录 一步一步学ROP之linux_x86篇(蒸米spark) 0x00 序 0x01 Control Flow Hijack 程序流劫持 0x02 Ret2libc – Bypass DEP 通过r ...
- 30分钟通过Kong实现.NET网关
什么是Kong Openrestry是一个基于Nginx与Lua的高性能平台,内部有大量的Lua库.其中ngx_lua_moudule使开发人员能使用Lua脚本调用Nginx模块.Kong是一个Ope ...