传说中的redo log有什么作用?

摘要:白日梦感觉作为研发同学的你可能真的没必要了解摸清楚关于redo log的这些机制。专注于写SQL完全能hold住日常的工作。 但是呢,感觉最好还是要了解一下,因为一般面试官都知道redo log是咋回事,其次是大家茶前饭后唠嗑时也能多少能插
目录一、引出 redo log 的作用二、思考一个问题:三、redo log block四、redo log buffer五、redo log的刷盘时机六、推荐参数七、redo log group推荐阅读 白日梦感觉作为研发同学的你可能真的没必要了解摸清楚关于redo log的这些机制。专注于写SQL完全能hold住日常的工作。 但是呢,感觉最好还是要了解一下,因为一般面试官都知道redo log是咋回事,其次是大家茶前饭后唠嗑时也能多少能插几句嘴。 文章公号 首发!连载中!关注微信公号回复:“抽奖” 还可参加抽📖活动 一、引出 redo log 的作用 继续我们的MySQL专题。首先回顾一下前面白日梦同你分享过的知识点。 前面我们一起学习了MySQL undo log相关的知识点,看下面这张脑图: 磁盘上的数据文件叫表空间文件,表空间有挺多的,比如系统表空间、undo log 表空间、你也可以让create出来的每张table都有自己单独的表空间。总之MySQL会将表空间数据页通过磁盘IO加载进缓存页中。 SQL执行器会执行你发送给MySQL的SQL语句,MySQL为了提高的性能,对于增、删、改这种操作都是在内存中完成的,所谓的内存就是上图中BufferPool。比如上图中的SQL执行器执行了一条update xxx where id = 1语句,然后这个id = 1数据行所在的数据页就会被你修改成脏数据页。 此外MySQL还有专门的后台线程等其他机制负责将脏数据页刷新同步回磁盘。 二、思考一个问题: 你可以结合上图然后想一下:万一脏页还没来得及刷新到磁盘中,MySQL就挂了,怎么办呢? 对于业务代码来说,方才执行的事务是OK的,甚至前端都接受到了请求成功的响应。那结果修改的数据没同步回磁盘,MySQL宕机了会不会导致真实数据和逻辑上的数据不一致呢? 其实不会的! MySQL使用redo log解决了这个问题,redo故名思义:重做。 当发生事务(增、删、改)时会导致缓存页变成脏页,于此同时MySQL会将事务涉及到的:对 XXX表空间中的XXX数据页XXX偏移量的地方做了XXX更新。 所以MySQL意外宕机重启也没关系。只要在重启时解析redo log中的事务然后重放一遍。将Buffer Pool中的缓存页重做成脏页。后续再在合适的时机将该脏页刷入磁盘即可。 于是对于业务方来说,everything is ok! redo log侧重于重做!redo log中记录的是物理层面的数据页、偏移量。应对的问题是:MySQL异常宕机后,如何将没来得及提交的事物数据重做出来。 而后面文章中和大家分享的bin log中记录了你对XXX表条件为XXX处的数据作了什么修改,这是些都是逻辑上的概念。 三、redo log block 首先你得知道,redo并不是一条条直接写入磁盘中去的! 在MySQL的设定中,redolog是按块,一块一块的写入到磁盘中去的。 你可以类比一下数据是按页为单位来组织的,就更容易理解为啥redo log 要按照block来组织redo。 本质上就是两个字:优化 log block长成下面这这样:分成Header、Body、Trailer三部分 总共512字节。而且是覆盖写入。 我粗略解读一下这幅脑图。 首先既然MySQL会写redo log,说明你的sql会对缓存页造成修改,也就意味着会走MySQL设定的事物那一套机制。既然是MySQL事物,大概率就是一组增、删、改。如果每个增、删、改都会有一个对应的redo log的话,那也就是说你的事物会产生好多redolog。这些redo会先被持续不断的写入到log block中,同一个事物产生的redo log会被标记为一个redo log group。 四、redo log buffer 了解redo log block之后,白日梦还要跟你介绍一下 redo log buffer。 这个redo log buffer 中会划分出多个rodo log block。redo log buffer 占用一块连续的内存空间,默认大小16MB。且MySQL允许我们通过参数innodb_log_buffer_size动态的调整它。增大它的大小可以让MySQL处理大事物是不必写入磁盘。进而提升写IO性能。 引入rodo log buffer之后,就可以勾勒出这样一副脑图。 如图,产生的redo log 先写入redo log block。然后redo log block其实就在redo log buffer 中。
阅读全文