MySQL进阶-日志篇(hot🔥)

小龙coding大约 2 分钟

MySQL (4)

前置知识

前置知识,为了保证事务ACID中的一致性与原子性,mysql采用WAL,预写日志,先写日志,合适时再写磁盘。

架构简述

innodb 引擎级别有 undo log 与 redo log,mysql server 级别有 bin log

注:日志之前你最好先看架构篇,了解 MySQL 架构怎样构成,不清楚大概看下我画的这个图吧

img

必须理解的结构buffer pool、缓存页、磁盘文件、OS cache、数据页

SQL执行流程:先找到表对应的表空间,然后找到表空间对应的磁盘文件,接着从磁盘文件里要更新的相关数据所在的数据页加载到buffer pool里的缓存页上,增删改查会针对buffer pool里的数据做操作 。

思考

其一,这一系列操作下来,事务(增删改SQL)更新了缓存页,然后事务提交了;还没来得 及让IO线程把缓存页刷新到磁盘文件里,此时MySQL宕机了,然后内存数据丢失,此时事务更新的数据也就丢失了,怎么搞?

面试官可能问:那我每次事务一提交,就立即把事务更新的缓存页都刷新回磁盘文件可以吗?

需要明白(重要)

  1. 其一缓存页 刷新到磁盘文件里,是随机磁盘读写,性能是相当的差,缓存页对应的位置可能在磁盘文件的一个随机位 置,比如偏移量为XXXX的某个地方;
  2. 其二,一个缓存页就是16kb,数据比较大,刷入磁盘比较耗时,每次修改可能就修改了缓存页里的几个字节的数据,修改一次缓存页就将缓存页都刷入磁盘及其浪费性能

这是,如果有个东西能顺序记录修改内容,且将修改累积到一定程度再按规则一次性有序刷盘,效率不就来啦(类比卸货推车)

其二,假如事务执行过程中失败啦,有怎么把数据恢复到最原始模样

因此,便引出了 undo log 与 redo log 日志

1、Redo Log

有何作用:

记录什么:

本质上记录的就是在对某个表空间的某个数据页的某个偏移量的地方修改了 几个字节的值,具体修改的值是什么:表空间号+数据页号+偏移量+修改几个字节的值+具体 的值