事务日志redo

redo 是什么?

redo 重做日志,是事务日志的一种

作用是在事务的ACID过程中,实现D持久化,事务提交时,先写重做日志再修改页;当由于发生宕机而导致数据丢失时,就可以通过重做日志来完成数据的恢复。

#redo位置
[root@db02 data]# ll /data/
-rw-rw---- 1 mysql mysql  50331648 Jun 24 22:46 ib_logfile0
-rw-rw---- 1 mysql mysql  50331648 Jun  9 16:06 ib_logfile1
#undo位置
[root@db02 data]# ll /data/
-rw-rw---- 1 mysql mysql  79691776 Jun 24 22:46 ibdata1
-rw-rw---- 1 mysql mysql 104857600 Jun 23 22:01 ibdata2

MySQL 每次数据库启动,都会比较磁盘数据页和redolog的LSN(日志序列号磁盘数据页),必须要求两者LSN一致数据库才能正常启动

REDO:记录的是,内存数据页的变化过程

REDO工作过程
image-eals.png

  1. 将stu表中id=1的行所在数据页加载到内存中buffer page
  2. 修改数据的内存拷贝并在redo log buffer中生成重做日志 将id=1变成id=2的变化过程会记录到redo内存区域
  3. 当事务commit时,将redo log buffer中的内容以追加方式刷新到磁盘的redo log file
  4. 定期将内存中修改的数据刷新到磁盘中

下面用一张动图可以看的更直观一点

redo_flush_log.gif

但是要注意MySQL服务端是一个进程,它运行于操作系统之上。也就是说,操作系统挂了MySQL一定挂了,但是MySQL挂了操作系统不一定挂。
所以MySQL挂了有两种情况:

  1. MySQL挂了,操作系统也挂了,也就是常说的服务器宕机了。这种情况Buffer Pool里面的数据会全部丢失,操作系统的os cache里面的数据也会丢失。
  2. MySQL挂了,操作系统没有挂。这种情况Buffer Pool里面的数据会全部丢失,操作系统的os cache里面的数据不会丢失。

redo log的刷盘机制由参数innodb_flush_log_at_trx_commit控制,这个参数有3个值可以设置:
innodb_flush_log_at_trx_commit = 1:实时写,实时刷
innodb_flush_log_at_trx_commit = 0:延迟写,延迟刷
innodb_flush_log_at_trx_commit = 2:实时写,延迟刷

innodb_flush_log_at_trx_commit = 1

这种策略会在每次事务提交之前,每次都会将数据从redo log刷到磁盘中去,理论上只要磁盘不出问题,数据就不会丢失。总结来说,这种策略效率最低,但是丢数据风险也最低。

redo_flush_log=1.gif

innodb_flush_log_at_trx_commit = 0

这种策略在事务提交时,只会把数据写到redo log buffer中,然后让后台线程定时去将redo log buffer里面的数据刷到磁盘。
这种策略是最高效的,但是我们都知道,定时任务是有间隙的,但是如果事务提交后,后台线程没来得及将redo log刷到磁盘,这个时候不管是MySQL进程挂了还是操作系统挂了,这一部分数据都会丢失。
总结来说这种策略效率最高,丢数据的风险也最高

redo_flush_log=0.gif

innodb_flush_log_at_trx_commit = 2

这种策略在事务提交之前会把redo log写到os cache中,但并不会实时地将redo log刷到磁盘,而是会每秒执行一次刷新磁盘操作。
这种情况下如果MySQL进程挂了,操作系统没挂的话,操作系统还是会将os cache刷到磁盘,数据不会丢失

redo_flush_log=2-magw.gif

但如果MySQL所在的服务器挂掉了,也就是操作系统都挂了,那么os cache也会被清空,数据还是会丢失。

redo_flush_log=2_1.gif

事务日志undo

undo是什么?

undo “回滚日志”,是事务日志的一种。

作用是什么?

在事务ACID过程中,实现的是“A”原子性(要不全部成功,要不全部失败)的作用。CI的特性也和undo有关

故障自动恢复图解

image-20210627221312382

undo_flush_log.gif

总结

  • Buffer Pool是MySQL进程管理的一块内存空间,有减少磁盘IO次数的作用。
  • redo log是InnoDB存储引擎的一种日志,主要作用是崩溃恢复,有三种刷盘策略,有innodb_flush_log_at_trx_commit 参数控制。
  • undo log是InnoDB存储引擎的一种日志,主要作用是回滚。
  • binlog是MySQL Server层的一种日志,主要作用是归档。