redo在ACID中作用,及一些概念

以下涉及文件在mysql配置的data数据目录下

1. redo log概念: 重做日志

  ib_logfile0 和 ib_logfile1 两个文件默认50M,用于存储redo log日志,轮询使用的,0满了用1, 1满了重用0;

  redo log的两个文件用于记录数据的变更,即脏页数据是如何变化而来的。首先是记录在redo log buffer中,在写回到redo文件中。

2. redo log buffer 概念:即redo内存缓冲区域。

3. data buffer poll 概念: 数据和索引缓冲池,即ibd文件的缓冲池。(脏页就发生在这里,redo log buffer中记录的也是这里的变化)

4. LSN概念: log sequence number日志序列号 

  LSN号存在于每个page中(构成ibd的单元,16kb大小,连续的64个构成区),redo log有关的两个文件中也有,

  redo log buffer中也有, data buffer poll中也有.

5. mysql每次重启, 必须比对ibd中page和redo log有关的两个文件中保存的LSN号,必须要求两者一致(能恢复一致), 才能正常启动。

  即要求ibd文件和ib_logfile0/1文件中的必须一致(或能恢复一致)。不一致时触发CSR机制

10. WAL概念:write ahead log日志优先写。

  日志优先于数据写入磁盘的,持久化的机制。

11. 脏页:

  内存脏页,内存中数据改变了,没写入磁盘之前,我们把内存页称之为脏页。

12. CKPT概念: checkpoint(检查点), 就是将脏页写到磁盘的动作。

13. TXID概念: 事务号,innodb会为每个事务生成一个事务号,伴随着整个事务的生命周期。

14. CSR机制概念:

  mysql数据库在重启时会校验ibd文件和ib_logfile0/1文件中保存的LSN日志序列号, 如果logfile中的版本优于ibd记录的版本,则会:

  1. 加载ibd数据到data buffer poll中,加载ib_logfile0/1中记录的变更日志到redo log buffer中,使用日志重新构造出脏页数据

    并立即触发CKPT机制, 将构造出的脏页数据写会到磁盘中,同时会同步LSN日志序列号保持和ib_logfile0/1一致。

总结:

  redo log , redo log buffer, ibd, data buffer poll在一个事务中都干了什么?

  1. 把事务中涉及到的数据行所在ibd page页整个16kb大小的内容及LSN号加载到data buffer poll中

  2. 修改data buffer poll中的数据及LSN号累加1.

  3. redo log buffer缓冲区中会记录data buffer poll中的数据变化日志及LSN号

  4. commit递交时,mysql的WAL机制使日志优先于数据写入磁盘(即redo log中,带LSN号),并返回事务成功提示。

  如果此时突然宕机,我们重启数据库时这四个又会发生什么变化?

  1. 数据库重启时会对比ibd中LSN号和redo log中记录的LSN号,如果不一致会触发CSR机制,如下:

    加载redo log中日志信息到redo log buffer中, 加载ibd数据到data buffer poll中,使用redo log buffer中的日志信息

    在data buffer poll中构造出脏页信息,并立即触发CKPT机制,把脏页数据及LSN号写回到磁盘(ibd文件中)。

  2. 此时重新检查ibd和ib_logfile0/1中的LSN号是否一致, 一致则数据库启动成功,不一致则失败。

    

原文地址:https://www.cnblogs.com/quzq/p/12839958.html