MySQL~Redo日志和Undo日志理解、为什么要有Redo日志、Redo日志的组成、特点、运行流程

2年前 (2022) 程序员胖胖胖虎阿
174 0 0

文章目录

        • 事务ACID特性是如何实现的
        • Redo日志
        • 为什么需要Redo日志
        • Redo日志特点、好处
        • Redo日志的组成
            • 缓冲区(`redo log buffer`)
            • 日志文件区(`redo log file`)
        • Redo日志运行流程

事务ACID特性是如何实现的

事务的四种特性大家都知道是原子性、一致性、隔离性和持续性,也就是ACID,那么这四种特性是如何实现的呢?

  • 隔离性由锁机制实现
  • 剩下的三种特性由事务的redo和undo日志实现:
    1.Redo Log是重做日志,可以再写入,恢复提交事务修改的数据页操作,来保证事务的持久性
    2.Undo Log是回滚日志,回滚行记录到某个保存点,来保证事务的原子性和一致性。

redo log 是存储引擎层(innodb)生成的日志,记录的是物理层面的对数据页的操作,比如在某数据页某偏移量下写入或删除了某数据。
undo log:存储引擎层(innodb)生成的日志,记录的是逻辑层面的操作,且记录的都是相反的操作,比如对某行数据进行了insert操作,uodo日志中就会记载相反的操作delete,主要用于事务的回滚。

  • Redo和Undo本质上都是一种恢复操作
    Undo是把对数据表的操作回滚回去的行为,而Redo操作是比如对表数据进行了操作,但是没有刷新到磁盘上时,数据库宕机了,在数据库重启后,可以去Redo日志中找回这种操作的记录,继续执行。

Redo日志

数据库的存储引擎(Innodb)是以数据页为单位来管理存储空间的,所有的数据都是放在磁盘中的。
加载一个数据页中的数据,需要先将这个数据页从磁盘缓存到内存中(放在Buffer Pool中)然后才可以访问。我们对数据库的增删改操作都是对内存中数据的修改,然后内存在将数据的变动以一定的频率刷新到磁盘上。

为什么不直接修改磁盘中的数据,而是先将数据加载到内存中,在内存里修改,然后再更新到磁盘上?
因为CPU更新内存中的数据比更新磁盘中的数据要快

MySQL~Redo日志和Undo日志理解、为什么要有Redo日志、Redo日志的组成、特点、运行流程

为什么需要Redo日志

  • 内存缓冲池的存在可以消除CPU和磁盘之间的割裂
  • checkpoint刷盘机制可以保证数据最终刷新到磁盘上
    但存在一个问题就是,刷盘机制不是改一点刷一点,而是一个间隔时间内刷新一次,如果在间隔时间内数据库宕机,那么这个间隔时间更新的数据就无法刷新到磁盘上,导致数据丢失。
  • 这和数据库持久性相矛盾,持久性要求一旦事务提交,那么事务修改的数据就会永久保存,即使系统崩溃。
    那如何解决这个矛盾,来保证持久性?
    解决办法就是,每次对内存数据的刷新,都把操作记录下来就好了。就算数据库宕机,我们也可以重启数据库后,重新执行记录的操作,就可以将没有成功刷新的数据刷新到磁盘上。
  • Innodb采用了"日志先行"策略,每次修改,先写日志,再写磁盘,只有日志写入成功,才算事务提交成功。
  • 日志就是Redo 日志。如果刷盘期间数据库宕机,就可以通过Redo日志来恢复,进一步保证了四大特性中的持久性。

MySQL~Redo日志和Undo日志理解、为什么要有Redo日志、Redo日志的组成、特点、运行流程

Redo日志特点、好处

好处:

  • 相比于直接刷磁盘,redo日志降低了刷盘次数
  • redo日志占用的空间非常小

特点:

  • 顺序写入(执行事务时,一条语句可能产生若干个日志语句,这些日志语句是按顺序写入磁盘的,是顺序IO,效率比随机IO快)
  • 不间断记录。redo 日志记录不间断,区别于bin日志一个事务提交才整个记录一次

Redo日志的组成

分为两个部分:缓冲区和日志文件区

缓冲区(redo log buffer
  • 缓冲区是内存层面的
  • 缓冲区默认大小16M,最小是1M,最大4096M
  • 缓冲区会将空间划分成一个个的缓冲块:
    MySQL~Redo日志和Undo日志理解、为什么要有Redo日志、Redo日志的组成、特点、运行流程

查看缓冲池的大小:

mysql> show variables like '%innodb_log_buffer_size%';
+------------------------+---------+
| Variable_name          | Value   |
+------------------------+---------+
| innodb_log_buffer_size | 1048576 |
+------------------------+---------+
1 row in set, 1 warning (0.12 sec)
日志文件区(redo log file
  • 日志文件是磁盘层面的
  • 查看mysql目录,其中logfile0logfile1就是redo日志的文件区:
    MySQL~Redo日志和Undo日志理解、为什么要有Redo日志、Redo日志的组成、特点、运行流程

Redo日志运行流程

MySQL~Redo日志和Undo日志理解、为什么要有Redo日志、Redo日志的组成、特点、运行流程

  • 过程:
    1.将原始数据从磁盘读入内存中,修改内存中的数据拷贝
    2.生成一条日志记入redo log buffer中,记录的是数据修改的值
    3.当事务提交时,将redo log buffer 中的内容刷新到redo log file ,对redo log file采取的是追加写的方式
    4.隔一段时间就将内存中修改的数据刷寻到磁盘中

相关文章

暂无评论

暂无评论...