这是我参与「第三届青训营 -后端场」笔记创作活动的的第8篇笔记
redo log(物理日志\重做日志)
redo log是InnoDB存储引擎层的日志,又称重做日志文件,是物理日志。redo log记录数据修改后新数据的备份、冗杂的undo log、未提交的事务和回滚的事务,数据缓存到内存中,只是在事务提交前将redo log持久化到磁盘
redo log可以保证即使数据库发生异常重启,之前提交的记录都不会丢失,保证了事务的持久性。当有一条记录需要更新的时候,InnoDB引擎就会先把记录写到
redo log中,并更新内存。之后,InnoDB引擎会在适当的时候,将这个操作更新到磁盘中,这个更新是在系统比较空闲的时候做,他的关键点是先写日志,再写磁盘。**
redo log**日志大小是固定的,若空间满了以后会回到头部停止更新,先加载一些数据到磁盘让出文件空间,之后继续写入
物理日志:因为
mysql数据最终是保存在数据页中的,物理日志记录的就是数据页变更。
为了保证Redo Log能够有比较好的IO性能,InnoDB 的 Redo Log的设计有以下几个特点:
-
尽量保持
Redo Log存储在一段连续的空间上。因此在系统第一次启动时就会将日志文件的空间完全分配。以顺序追加的方式记录Redo Log,通过顺序IO来改善性能。 -
redo log包括两部分:一是内存中的日志缓冲(redo log buffer),该部分日志是易失性的;二是磁盘上的重做日志文件(redo log file),该部分日志是持久的。日志并不是直接写入文件的,而是先写入日志缓冲,当需要将日志刷新到磁盘时(如事务提交),将许多日志一起写入磁盘.
-
并发的事务共享
Redo Log的存储空间,它们的Redo Log按语句的执行顺序**,依次交替的记录在一起,以减少日志占用的空间。所以,当一个事务将Redo Log写入磁盘时,也会将其他未提交**的事务的日志写入磁盘。 -
Redo Log上只进行顺序追加的操作,当一个事务需要回滚时,它的Redo Log记录也不会从Redo Log中删除掉。
注意:
一般在事务提交之前会将redo log持久化到磁盘中,以此来保证持久性