Mysql

关注公众号 jb51net

关闭
首页 > 数据库 > Mysql > MySQL事务日志redo log

详解MySQL事务日志redo log

作者:JAVA旭阳

你知道MySQL 中是如何保证数据不丢失的吗,即便是MySQL发生异常重启了,数据也可以恢复,你了解MySQL产生的事务日志redo log是干嘛的吗,明白它的工作机制吗,本文就给大家详细讲解MySQL事务日志redo log

redo log介绍

redo log又叫“重做日志”,是存储引擎层 (innoDB) 生成的日志,记录的是"物理级别"上的页修改操作,比如页号x,偏移量y写入了'z'数据,主要目的为了保证数据不丢失,当MySQL发生宕机的时候,可以利用redo log日志进行数据恢复,如下图所示。

默认的redo log日志文件为ib_logfile0, ib_logfile1,如下图:

那想过为什么要"多此一举"先写入到redo log磁盘文件中,然后再落到数据库表中?而不直接落到数据库表中?

主要是因为顺序IO性能远高于随机IO。

数据在MySQL中存储是以页为单位,事务中的数据可能遍布在不同的页中,如果直接写入到对应的页中,是随机IO写入。

redo log是通过顺序IO"追加"的方式写入到文件末尾,而且写入的内容也是物理日志,比如比如,某个事务将系统表空间中第10号页面中偏移量为 100 处的那个字节的值 1 改成 2等信息,日志占用空间也很小。

redo log整体流程

事务在写入到数据库中涉及到redo log的整体流程如下图所示:

性能不够,缓存来凑。由于CPU的性能远远大于磁盘,为了消除这个鸿沟,引入了两个缓存,Buffer Poolredo log bufferBuffer Pool用来存放各种操作,比如写入数据时,先写到内存中,然后由后台线程再刷写到磁盘。redo log buffer用来存放重做日志,后续刷到磁盘中。

上面流程中这种先写日志,再写磁盘,只有日志写入成功,才算事务提交成功的技术思想在MySQL也叫做WAL技术 (Write-Ahead Logging)。

redo log落盘策略

事务的日志是先写入到redo log buffer 中是很快的,那如何保证redo log buffer中的信息高效的落到磁盘日志文件中呢?

InnoDB引擎提供了 innodb_flush_log_at_trx_commit 参数,该参数控制 commit提交事务时,如何将 redo log buffer 中的日志刷新到 redo log file 的3种策略。

失。可以保证ACID的D,数据绝对不会丢失,但是效率最差的。

除了上面3种策略进行刷盘以外,还有两种场景会让一个没有提交的事务的 redo log 写入到磁盘中。

小结:

我们可以根据实际的业务场景,在性能和持久性做一些权衡,但建议使用默认值,虽然操作系统宕机的概率理论小于数据库宕机的概率,但是一般既然使用了事务,那么数据的安全相对来说更重要些。

redo log写入数据页机制

目前事务日志已经落入到磁盘的redo log file中了,MySQL会去读取这个文件将数据写入到数据页中。

很显然,目前对redo log file会进行读和写的操作。在日志文件组中有两个重要的“指针”,分别是 write pos、``checkpoint

这就是整个redo log file中的日志恢复到数据页中的过程。

总结

本文讲解了事务日志redo log在MySQL innoDB存储引擎工作的机制,它主要是用来保证事务的持久性,避免数据丢失。如果本文对你有帮助,请留下一个赞。

到此这篇关于详解MySQL事务日志redo log的文章就介绍到这了,更多相关MySQL事务日志redo log内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文