重做日志(Redo log)

重做日志(Redo log),也叫做前滚日志,存放在如下位置,轮询使用,记录着内存中数据页的变化,在事务 ACID 过程中,主要实现的是 D(Durability)的作用,对于 A(Atomicity)C(Consistency) 也有相应的作用

# Redo Log 日志文件的位置
# ib_logfile0 与 ib_logfile1 轮询使用,默认 48MB
[root@db01 data]# ll /application/mysql/data/
-rw-rw---- 1 mysql mysql 50331648 Aug 15 06:34 ib_logfile0
-rw-rw---- 1 mysql mysql 50331648 Mar 6 2017 ib_logfile1

Redo Log 日志中,记录着内存中的数据页的变化过程(不是 SQL 语句),以及数据页当前的 LSN(Log Sequence Number)日志序列号

Redo Log Buffer:记录数据页的变化过程的内存缓冲区,数据页当前的 LSN(Log Sequence Number)日志序列号

Data Page Buffer Pool:当执行 DML 时,MySQL 将数据(至少一页 16K)取到该数据缓冲内存中,在当前内存中修改该数据,并将变化的过程存储到 Redo Buffer 中,修改完数据不会马上存储回硬盘,因为每一条 DML 语句都至少调取一页数据(16K),存储时也至少存储一页数据(16K)。若执行大量的 DML 会进行大量的 IO 操作

LSN(Log Sequence Number)日志序列号:日志序列号,占用 8 字节,主要用于发生 Crash 时对数据进行 Recovery,LSN 是一个一直递增的整型数字,表示事务写入到日志的字节总量

CSR(Crash Safety-Recovery )故障自动恢复:出现宕机,即使磁盘中的zzzwqh.ibd文件中没有存储数据,根据 redo log 也可以恢复数据。

CSR(Crash Safety-Recovery)故障自动恢复过程:重启数据库时,MySQL 将 .ibd 文件取到 Data Buffer Page Pool 内存中,将 redo log 取到 Redo Buffer 内存中,对比两者的 LSN(Log Sequence Number)日志序列号,将变化后的数据真正落入到 .ibd 文件中,所以很多时候重启数据库会很慢

WAL(Write Ahead Log)日志优先写:Redo log 要比数据要优先写入磁盘中,因为 IO 速率更快

举例描述流程

# 修改
1)首先将表中 id=1 的行所在数据页(16K)加载到内存中 Data Page Buffer Pool
2)MySQL实例在内存中将 id=1 的数据改成 id=2
3)id=1 变成 id=2 的变化过程会记录到,redo 内存区域,也就是 Redo Buffer Pool
4)当敲下 commit 命令的瞬间,MySQL会将 Redo Buffer Pool 写入磁盘区域 Redo Log
5)当写入成功之后,commit 返回 ok,commit 一般很快,因为需要写的 Log 数据很少(相对于表数据) # 查询
1.首先将表中 id=1 的行所在数据页加载到内存中 Data Page Buffer Pool
2.将 Redo Log 中 id=1 变成 id=2 的变化过程取加载到 Redo Buffer Pool
3.通过 Data Page Buffer Pool 和 Redo Buffer Pool 得到一个结果

回滚日志(Undo Log)

回滚日志(Undo Log)存储了事务工作过程中的回滚信息(与 Redo Log 记录的变化过程 相反的操作),在事务ACID 过程中,实现的是 A(Atomicity)的作用,C(Consistency)与 I(Isolation)的特性也和 Undo log 有关

# Undo Log 日志文件的位置,默认存储在共享表空间
[root@db01 data]# ll /application/mysql/data/
-rw-rw---- 1 mysql mysql 79691776 Aug 15 06:34 ibdata1
-rw-rw---- 1 mysql mysql 79691776 Aug 15 06:34 ibdata2

Undo Log 日志中,记录是否执行 Commit,以 Redo Log 事务变化过程的反过程

在 Redo Log 中,记录着 Commit 提交过的事务,但也记录着长时间未 Commit 但写入到 Redo Log 中的事务(会有与 Commit 不同的特殊标记)

即使 Redo Log 记录了长时间未 Commit 但写入的事务,也不会返回修改后的结果,因为返回过程中,需要去 Undo Log 中确认这个事务是否 Commit,再返回结果

最新文章

  1. loss function
  2. MineCraft note
  3. 基于.NET的CAD二次开发学习笔记一:CAD开发入门
  4. Android系统Surface机制的SurfaceFlinger服务渲染应用程序UI的过程分析
  5. iNode for linux install
  6. Windows Service 之 安装失败后的删除
  7. MDAC 在WINDOWS XP SP3 不能安装 的解决方法
  8. Android(java)学习笔记172:BroadcastReceiver之 Android广播机制
  9. yii2 and short_open_tag
  10. wget www.baidu.com执行流程分析
  11. Hbase初体验
  12. 发展合作-ASP.Net传递页面之间的值
  13. PortMon(电脑开放端口检查工具) 3.03 免费绿色版
  14. This Handler class should be static or leaks might occur Android
  15. Ext表格分页
  16. Java NIO学习笔记七 Non-blocking Server
  17. linux 巨页使用测试
  18. Linux 防火墙相关
  19. T-SQL:探究UNOIN,INTERSECT,EXCEPT集合运算符(十一)
  20. linux笔记-多服务器同时执行相同命令

热门文章

  1. leetcode 473. 火柴拼正方形(DFS,回溯)
  2. Getshell
  3. awk中引用shell变量的方法
  4. Java中的NIO进阶
  5. 前端知识(二)04-vue-element-admin-谷粒学院
  6. pycharm安装完成后的一些基本设置
  7. LR 场景中Windows资源配置设置
  8. 学习Python之路
  9. CAP理论解读
  10. LOJ10098