zoukankan      html  css  js  c++  java
  • MySQL 事务日志

    重做日志(Redo log)

    重做日志(Redo log),也叫做前滚日志,存放在如下位置,轮询使用,记录着内存中数据页的变化,在事务 ACID 过程中,主要实现的是 D(Durability)的作用,对于 A(Atomicity)C(Consistency) 也有相应的作用

    # Redo Log 日志文件的位置
    # ib_logfile0 与 ib_logfile1 轮询使用,默认 48MB
    [root@db01 data]# ll /application/mysql/data/
    -rw-rw---- 1 mysql mysql 50331648 Aug 15 06:34 ib_logfile0
    -rw-rw---- 1 mysql mysql 50331648 Mar  6  2017 ib_logfile1
    

    Redo Log 日志中,记录着内存中的数据页的变化过程(不是 SQL 语句),以及数据页当前的 LSN(Log Sequence Number)日志序列号

    Redo Log Buffer:记录数据页的变化过程的内存缓冲区,数据页当前的 LSN(Log Sequence Number)日志序列号

    Data Page Buffer Pool:当执行 DML 时,MySQL 将数据(至少一页 16K)取到该数据缓冲内存中,在当前内存中修改该数据,并将变化的过程存储到 Redo Buffer 中,修改完数据不会马上存储回硬盘,因为每一条 DML 语句都至少调取一页数据(16K),存储时也至少存储一页数据(16K)。若执行大量的 DML 会进行大量的 IO 操作

    LSN(Log Sequence Number)日志序列号:日志序列号,占用 8 字节,主要用于发生 Crash 时对数据进行 Recovery,LSN 是一个一直递增的整型数字,表示事务写入到日志的字节总量
    CSR(Crash Safety-Recovery )故障自动恢复:出现宕机,即使磁盘中的zzzwqh.ibd文件中没有存储数据,根据 redo log 也可以恢复数据。
    CSR(Crash Safety-Recovery)故障自动恢复过程:重启数据库时,MySQL 将 .ibd 文件取到 Data Buffer Page Pool 内存中,将 redo log 取到 Redo Buffer 内存中,对比两者的 LSN(Log Sequence Number)日志序列号,将变化后的数据真正落入到 .ibd 文件中,所以很多时候重启数据库会很慢

    WAL(Write Ahead Log)日志优先写:Redo log 要比数据要优先写入磁盘中,因为 IO 速率更快

    举例描述流程

    # 修改
    1)首先将表中 id=1 的行所在数据页(16K)加载到内存中 Data Page Buffer Pool 
    2)MySQL实例在内存中将 id=1 的数据改成 id=2
    3)id=1 变成 id=2 的变化过程会记录到,redo 内存区域,也就是 Redo Buffer Pool
    4)当敲下 commit 命令的瞬间,MySQL会将 Redo Buffer Pool 写入磁盘区域 Redo Log
    5)当写入成功之后,commit 返回 ok,commit 一般很快,因为需要写的 Log 数据很少(相对于表数据)
    
    # 查询
    1.首先将表中 id=1 的行所在数据页加载到内存中 Data Page Buffer Pool 
    2.将 Redo Log 中 id=1 变成 id=2 的变化过程取加载到  Redo Buffer Pool
    3.通过  Data Page Buffer Pool 和 Redo Buffer Pool 得到一个结果
    

    回滚日志(Undo Log)

    回滚日志(Undo Log)存储了事务工作过程中的回滚信息(与 Redo Log 记录的变化过程 相反的操作),在事务ACID 过程中,实现的是 A(Atomicity)的作用,C(Consistency)与 I(Isolation)的特性也和 Undo log 有关

    # Undo Log 日志文件的位置,默认存储在共享表空间
    [root@db01 data]# ll /application/mysql/data/
    -rw-rw---- 1 mysql mysql 79691776 Aug 15 06:34 ibdata1
    -rw-rw---- 1 mysql mysql 79691776 Aug 15 06:34 ibdata2
    

    Undo Log 日志中,记录是否执行 Commit,以 Redo Log 事务变化过程的反过程

    在 Redo Log 中,记录着 Commit 提交过的事务,但也记录着长时间未 Commit 但写入到 Redo Log 中的事务(会有与 Commit 不同的特殊标记)

    即使 Redo Log 记录了长时间未 Commit 但写入的事务,也不会返回修改后的结果,因为返回过程中,需要去 Undo Log 中确认这个事务是否 Commit,再返回结果

    记录成长过程
  • 相关阅读:
    paraview将csv格式显示为云图
    Valgrind安装与使用
    vscode+WSL+Debug+Cmake+OpenGL
    MFiX中DEM颗粒信息随时间变化
    origin添加两个Y轴
    conda回滚
    onedrive同步其他任意文件夹
    MFiX-DEM中的并行碰撞搜索
    MFiX-DEM中的串行碰撞搜索
    【Go】四舍五入在go语言中为何如此困难
  • 原文地址:https://www.cnblogs.com/zzzwqh/p/13357738.html
Copyright © 2011-2022 走看看