• 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号是否一致, 一致则数据库启动成功,不一致则失败。

        

  • 相关阅读:
    C#序列化效率对比
    将聚合记录集逆时针和顺时针旋转90度(行列互换)
    Sql的行列转换
    log4net配置
    input框添加阴影效果
    WCF自定义地址路由映射(不用svc文件)
    Jquery对当前日期的操作(格式化当前日期)
    用JQuery获取输入框中的光标位置
    sublime text3安装后html:5+Tab不能快速生成html头部信息的解决办法
    js获取url传递参数,js获取url?号后面的参数
  • 原文地址:https://www.cnblogs.com/quzq/p/12839958.html
Copyright © 2020-2023  润新知