MySQL事务日志

文章目录

  • 1. redo日志

1. redo日志

口述:redo log 日志其实保证了ACID中的持久性,就是说当事务commit后,那么相应的修改呀更新这些操作其实都会记录到redo log中,其实这里的操作还是区别于redis中的aof中,它不是具体的sql语句,而是说我们的sql语句执行后具体要做的事:比如说sql语句更新什么什么页中的哪个记录,其实它是记录的这些具体的在磁盘中的数据页的记录的这些变动,那有了redo log的话其实就保证了数据的不会丢失,即使事务commit后宕机了,那redo log文件还是有记录的,当宕机恢复后还是可以将数据同步到磁盘的。
这里要再细说的话,其实每执行这些修改语句的话,其实都会写入 redo log buffer缓冲区的, redo log buffer再写入到文件系统缓存Page Cache中,然后再刷新到磁盘中的redo file 文件中,其实这里的刷新的话其实是写入到redo log file中,并不是真正的同步数据,只是做个记录,因为其实redo log file记录的话我们只需要按顺序吧需要改的页记录下来,需要改的值记录下来,并不是真正的在B+tree中修改数据,因为这个可以避免这种随机IO,因为你要改的话肯定是找到具体的页具体的记录再改,比较耗时,不可能这样直接去改的,所以先写到redo log file中,这也是顺序IO,性能较好,然后定期再从redo log file(其实也就是内存修改的数据)更新到磁盘。

事务有4种特性:原子性、一致性、隔离性和持久性。那么事务的四种特性到底是基于什么机制实现呢?

事务的隔离性锁机制实现
而事务的原子性、一致性和持久性由事务的redo日志undo日志来保证。
1)redo log称为重做日志,提供再写入操作,恢复提交事务修改的页操作,用来保证事务的特久性
2)undo log称为回滚日志,回滚行记录到某个特定版本,用来保证事务的原子性一致性

redo log 的作用:
InnoDB引擎的事务采用了WAL技术(Write-Ahead Logging ),这种技术的思想就是先写日志,再写磁盘,只有日志写入成功,才算事务提交成功,这里的日志就是redo log。当发生宕机且数据未刷到磁盘的时候,可以通i过redo log来恢复,保证ACID中的D,
这就是redo log的作用。

redo log 的特点:

  • redo日志是顺序写入磁盘的

  • 在执行事务的过程中,每执行一条语句,就可能产生若干条redo日志,这些日志是按照产生的l顺序写入磁盘的,也就是使用顺序IO,效率比随机lO快。
    事务执行过程中,redo log不断记录

  • redo log跟bin log的区别,redo log是存储引擎层产生的,而bin log是数据库层产生的。假设一个事务,对表做10万行的记录插入,在这个过程中,一直不断的往redo log顺序记录,而bin log不会记录,直到这个事务提交,才会一次写入到bin log文件中

redo log的刷盘策略(这里的刷盘是指将redo log buffer中的内容刷新到redo log file文件中)
redo log的写入并不是直接写入磁盘的,InnoDB引擎会在写redo log的时候先写redo log buffer,之后以 一定的频率刷到真正的redo log file 中
MySQL事务日志_第1张图片

  • innodb_flush_log_at_trx_commit=0:事务commit后就会在redo log buffer中记录这些操作,由InnoDB的后台线程每一秒将redo log buffer中的数据写入 Page Cache,再写入到 redo log file中,因为它不管,事务commit后在 redo log buffer中记录了就不管了,而是由InnoDB的后台线程每一秒来去写入到Page Cache,所以可能丢失一秒的数据,无法保证ACID中的D。
  • innodb_flush_log_at_trx_commit=1:只要事务提交成功,redo log记录就一定在硬盘里,不会有任何数据丢失
  • innodb_flush_log_at_trx_commit=2:只要事务提交成功,redo log buffer 中的数据就写入到Page Cache,之后操作系统每一秒再写入到 redo log file中。

写入redo log buffer 过程
MySQL把对底层页面中的一次原子访问的过程称之为一个Mini-Transaction,简称mtr,比如,向某个索引对应的B+树中插入一条记录的过程就是一个Mini-Transaction。一个所谓的mtr可以包含一组redo日志,在进行崩溃恢复时这一组redo日志作为一个不可分割的整体。
MySQL事务日志_第2张图片
MySQL事务日志_第3张图片
buffer free中记录了使用到的位置,下次来mtr的话在这个位置写入。

redo log小结MySQL事务日志_第4张图片

你可能感兴趣的:(数据库,Mysql)