其中slowlog、binlog、errorlog、relaylog归属于MySQL服务层;undolog、redolog归属于引擎层,为innodb所特有。1.2 MySQL日志分类
事务需要包管原子性,也是说事务中的操纵要么全部完成,要么什么也不做。如果事务执行到一半,堕落了怎么办-回滚。但是怎么回滚呢,靠 undo 日志。undo 日志就是我们执行sql的逆操纵好比现在Tom的账户余额有100,现在有一个事务需要把Tom的账户余额更新为300,大抵的流程如下图:
- undo 日志有两个作用:提供回滚和多个行版本控制(MVCC)
- 数据页里一行数据的格式 见3.3版本链,其中 roll_point 会指向一个undo 日志
- undo 日志一般会在事务提交时被删除,但是如果 undo 日志为 MVCC 服务 则暂时保存
- 一个事务会产生多个 undo 日志,mysql有专门的 undo 页 保存 undo 日志。innodb 会为每一个事务单独分配 undo 页链表(最多分配 4 个链表)
介绍下 缓冲池与数据页的概念redo log的更新流程如下,以一次update操纵为例
MySQL中数据是以页为单元,你查询一条记载,会从硬盘把一页的数据加载出来,加载出来的数据叫数据页,会放入到Buffer Pool中。后续的查询都是先从Buffer Pool中找,没有命中再去硬盘加载,淘汰硬盘IO开销,提升性能。
- 缓冲池(buffer pool):主内存中的一个区域,里面可以缓存磁盘上经常操纵的真实数据,在执行增编削查操纵时,先操纵缓冲池中的数据(若缓冲池没有数据,则从磁盘加载并缓存),以一定频率革新到磁盘,从而淘汰磁盘IO,加快处理处罚速度
- 数据页(page):是InnoDB 存储引擎磁盘管理的最小单元,每个页的巨细默认为 16KB。页中存储的是行数据
更新表数据的时间,也是如此,发现Buffer Pool里存在要更新的数据,就直接在Buffer Pool里更新。然后会把在某个数据页上做了什么修改记载到重做日志缓存(redo log buffer)里,接着刷盘到redo log文件里。同时,InnoDB引擎会在适当的时间,将这个操纵记载更新到磁盘里面。
还记得《孔乙己》这篇文章,饭店掌柜有一个粉板,专门用来记载客人的赊账记载。如果赊账的人不多,那么他可以把顾客名和账目写在板上。但如果赊账的人多了,粉板总会有记不下的时间,这个时间掌柜一定另有一个专门记载赊账的账本。为什么需要 redo log?
如果有人要赊账或者还账的话,掌柜一般有两种做法:
在买卖红火柜台很忙时,掌柜一定会选择后者,由于前者操纵实在是太贫苦了。首先,你得找到这个人的赊账总额那条记载。你想想,密密麻麻几十页,掌柜要找到那个名字,可能还得带上老花镜慢慢找,找到之后再拿出算盘盘算,最后再将结果写回到账本上。
- 一种做法是直接把账本翻出来,把这次赊的账加上去或者扣撤除;
- 另一种做法是先在粉板上记下这次的账,等打烊以后再把账本翻出来核算。
这整个过程想想都贫苦。相比之下,照旧先在粉板上记一下方便。你想想,如果掌柜没有粉板的帮助,每次记账都得翻账本,效率是不是低得让人难以忍受?
逻辑日志:可以简单理解为记载的就是sql语句如果不警惕整个数据库的数据被删除了,能利用redo log文件恢复数据吗?
物理日志:由于mysql数据最终是保存在数据页中的,物理日志记载的就是数据页变更
先写处于prepare状态的redo log,事务提交后,再写处于commit状态的redo log。由于redo log的提交分为prepare和commit两个阶段,以是称之为两阶段提交。为什么需要两阶段提交?
redo log(重做日志)让 InnoDB 存储引擎拥有了崩溃恢复能力;bin log(归档日志)包管了MySQL集群架构的数据一致性
欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) | Powered by Discuz! X3.4 |