@

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的区别:

  1. redo log是InnoDB特有的日志,binlog 所有引擎都可以使用
  2. redo log是物理日志,记录的是该数据页更新的内容;binlog是逻辑日志,记录的是这个更新语句的原始逻辑
  3. redo log是循环写的,空间固定会用完。binlog是可以追加写的,当binlog写到一定大小会切换到下一个,并不会覆盖以前的日志
  4. 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回滚那些未提交的事务,被回滚了的事务在恢复时先redoundo,也不会破坏数据的一致性

  • ​ 必须要在写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事务日志undo log和redo log分析

【Mysql】三大日志 redo log、bin log、undo log的更多相关文章

  1. 详细分析MySQL事务日志(redo log和undo log)

    innodb事务日志包括redo log和undo log.redo log是重做日志,提供前滚操作,undo log是回滚日志,提供回滚操作. undo log不是redo log的逆向过程,其实它 ...

  2. 详细分析MySQL事务日志(redo log和undo log) 表明了为何mysql不会丢数据

    innodb事务日志包括redo log和undo log.redo log是重做日志,提供前滚操作,undo log是回滚日志,提供回滚操作. undo log不是redo log的逆向过程,其实它 ...

  3. 【MySQL (六) | 详细分析MySQL事务日志redo log】

    Reference:  https://www.cnblogs.com/f-ck-need-u/archive/2018/05/08/9010872.html 引言 为了最大程度避免数据写入时 IO ...

  4. MySQL必知必会:简介undo log、truncate、以及undo log如何帮你回滚事物

    目录 一.前言 二.undo log表空间 三.关于undo log默认的配置 四.如何将undo log放到单独的表空间 文章公众号首发,持续更新中 五.rollback segment 六.什么是 ...

  5. MySQL学习总结:提问式回顾 undo log 相关知识

    原文链接:MySQL学习总结:提问式回顾 undo log 相关知识 1.redo 日志支持恢复重做,那么如果是回滚事务中的操作呢,也会有什么日志支持么? 也回滚已有操作,那么就是想撤销,对应的有撤销 ...

  6. 必须了解的mysql三大日志-binlog、redo log和undo log

    日志是 mysql 数据库的重要组成部分,记录着数据库运行期间各种状态信息.mysql日志主要包括错误日志.查询日志.慢查询日志.事务日志.二进制日志几大类.作为开发,我们重点需要关注的是二进制日志( ...

  7. 女朋友说:你要搞懂了MySQL三大日志,我就让你嘿嘿嘿!

    1. 背景 MySQL实现事务.崩溃恢复.集群的主从复制,底层都离不开日志,所以日志是MySQL的精华所在.只有了解MySQL日志,才算是彻底搞懂MySQL. 今天一灯就带你深入浅出的学习MySQL的 ...

  8. MySQL日志系统bin log、redo log和undo log

    MySQL日志系统bin log.redo log和undo log   今人不见古时月,今月曾经照古人. 简介:日志是MySQL数据库的重要组成部分,记录着数据库运行期间各种状态信息,主要包括错误日 ...

  9. MySQL中的redo log和undo log

    MySQL中的redo log和undo log MySQL日志系统中最重要的日志为重做日志redo log和归档日志bin log,后者为MySQL Server层的日志,前者为InnoDB存储引擎 ...

随机推荐

  1. CAD/DWG图Web网页可视化技术之栅格和矢量瓦片

    背景 在上一篇博文中CAD图DWG解析WebGIS可视化技术分析总结提到,实现CAD/DWG图形Web展示的思路一般为解析AutoCAD图形格式,然后转成html5所能绘制的格式如svg,geojso ...

  2. 其他css属性和特性

    其他css属性和特性 设置元素的颜色和透明度 下表列出了这些属性. 颜色相关属性 属 性 说 明 值 color 设置元素的前景色 <颜色> opacity 设置颜色的透明度 <数值 ...

  3. spring boot log4j2 最佳实践

    为什么选择 log4j2 Log4j2 使用了 LMAX Disruptor 库.在多线程场景中,异步 Logger 的吞吐量比 Log4j 1.x 和 Logback 高 18 倍,延迟低几个数量级 ...

  4. SharkCTF2021 The_nature_of_the_human

    (信安数基的quiz1写不出来 来这放题解泄愤) crypto类题. 题面 其加密的大致过程是,对明文flag中的逐个字符,随机使用三种加密方式: 第一种,对该字符进行sha256加密后以16进制形式 ...

  5. Java:NIO 学习笔记-2

    Java:NIO 学习笔记-2 上一篇 NIO 学习笔记-1 看了 尚硅谷 的相应教程,此处又对比看了 黑马程序员 的课程 JAVA通信架构I/O模式,做了相应的笔记 前言 在 Java 的软件设计开 ...

  6. 树链剖分好(du)题(liu)选做

    1.luogu P4315 月下"毛景树" 题目链接 前言: 这大概是本蒟蒻A掉的题里面码量最大的一道题了.我自认为码风比较紧凑,但还是写了175行. 从下午2点多调到晚上8点.中 ...

  7. 零基础小白要如何跟好的学习嵌入式Linux(转)

    作为一个新人,怎样学习嵌入式Linux?被问过太多次,特写这篇文章来回答一下. 在学习嵌入式Linux之前,肯定要有C语言基础.汇编基础有没有无所谓(就那么几条汇编指令,用到了一看就会). C语言要学 ...

  8. Codeforces Round #741 (Div. 2)部分题题解

    我果然还是太菜了,就写了两道题....真是水死了.... A The Miracle and the Sleeper 简化题意:给定\(l,r\),求\(a\)%\(b\)的最大值,其中\(r> ...

  9. 一步一步学ROP之linux_x86篇(蒸米spark)

    目录 一步一步学ROP之linux_x86篇(蒸米spark) 0x00 序 0x01 Control Flow Hijack 程序流劫持 0x02 Ret2libc – Bypass DEP 通过r ...

  10. 30分钟通过Kong实现.NET网关

    什么是Kong Openrestry是一个基于Nginx与Lua的高性能平台,内部有大量的Lua库.其中ngx_lua_moudule使开发人员能使用Lua脚本调用Nginx模块.Kong是一个Ope ...