执行数据流程

mysql中redo log是如何进行崩溃恢复的 mysql redo log buffer_缓存


1.从磁盘加载数据到buffer pool,会先去判断要更新的数据所在数据页是否已经被加载到了,如果已经被加载到了buffer pool中的数据页就直接使用。

2.写入数据的旧值到undo log日志中,用于事务回滚。

3.更新buffer pool数据页中内存数据。

4.写入内存中的redo log,这个时候还没写入磁盘中,记录对那个表那条记录做了什么操作。

5.提交事务,将内存的redo log写入磁盘中的redo log日志,用于崩溃恢复。

6.提交事务之前,还要在内存中写binlog日志,提交事务时写入磁盘文件。

7.将commit标记写入redo log,数据最后通过线程写入磁盘整个流程完成。

注意:最后一步是为了让redo log与binlog保持一致。5、6、7三步都执行完成才算提交事务完毕。

几个链表的使用

接着我们来讲讲,你的Buffer Pool在运行中被使用的时候,实际上会频繁的从磁盘上加载数据页到他的缓存页里去,
然后free链表、flush链表、lru链表都会在使用的时候同时被使用
比如数据加载到一个缓存页,free链表里会移除这个缓存页,然后lru链表的冷数据区域的头部会放入这个缓存页。
然后如果你要是修改了一个缓存页,那么flush链表中会记录这个脏页,lru链表中还可能会把你从冷数据区域移动到热
数据区域的头部去。
如果你是查询了一个缓存页,那么此时就会把这个缓存页在lru链表中移动到热数据区域去,或者在热数据区域中也有
可能会移动到头部去。
总之,MySQL在执行CRUD的时候,首先就是大量的操作缓存页以及对应的几个链表。然后在缓存页都满的时候,必
然要想办法把一些缓存页给刷入磁盘,然后清空这几个缓存页,接着把需要的数据页加载到缓存页里去!