一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第19天,点击查看活动详情
redo log重做日志和undo log回滚日志都是在数据变更的时候会记录数据的变更日志,假设是更新数据,首先先去buffer pool里找到对应数据记录的数据页,如果对应记录数据页不存在缓冲池中,那么需要去磁盘加载对应的数据到缓冲池中。
如果此时缓冲池中内存用尽,那么需要将最近最少使用的数据页在内存中删除,删除前会判断数据页是否为脏页(也就是数据还未写入到磁盘上的数据,内存中数据和磁盘不一致)。
在修改缓冲池数据之前会先生成一条数据未修改时的undo log用于回滚,记录好undo log之后才回去修改缓冲池中数据页中需要修改的数据,修数据页中数据时会同步向redo log buffer新增修改的数据,至于redo log buffer什么时候写入到
redo log file由事务提交策略决定,事务提交策略在之前的文章我有详细说明,只有在事务提交成功的时候才会生成bin log日志,bin log日志用于主从复制,当bin log写入数据时会根据设置的slave从机将二进制日志发送到从机,从机会将这些日志写入到本地relay log日志文件中,slave从机再根据relay log日志重新执行日志文件中的变更保持数据同步。
这里掘友们可以想一下为什么bin log日志不和redo log、undo log日志一样,做异步提交,其实也好理解,假设在事务提交前先将bin log日志记录且此时恰好bin log日志被master主机同步推送到slave从机,并且此时事务回滚那么就会造成主从数据不一致的情况,那么这个时候我们去查slave发现有数据而master却没有数据,这个时候肯定会很懵逼,所以必须得保证主机有数据在从机之前。
具体的流程图如下: