【mysql】详细分析MySQL事务日志(redo log和undo log)
发布日期:2021-05-08 11:05:02 浏览次数:23 分类:精选文章

本文共 2240 字,大约阅读时间需要 7 分钟。

概述

InnoDB的事务日志包括redo logundo logredo log用于支持事务前滚操作,而undo log用于支持事务回滚操作。两者在事务持久化中扮演着重要角色。

1. redo log

1.1 redo log与二进制日志的区别

redo log是InnoDB层特有的日志类型,只记录InnoDB层中表的修改。与之相比,二进制日志(binlog)是服务器层产生的日志,支持所有存储引擎。二进制日志通常记录的是逻辑操作(如SQL语句),而redo log记录的是物理页的修改。

  • 二进制日志

    • 生成在服务器层,不受存储引擎类型影响。
    • 记录的是逻辑操作(如插入、更新、删除等)。
    • 记录顺序与提交顺序一致。
    • 在提交时,二进制日志会先于redo log写入磁盘。
  • redo log

    • 生成在InnoDB层,仅记录InnoDB表的修改。
    • 记录的是物理页的变化。
    • 提交时,redo log会被优先写入磁盘。

1.2 redo log的基本概念

redo log主要由两个部分组成:

  • 内存缓冲区(redo log buffer:用于存储临时的日志数据。
  • 磁盘文件(redo log file:存储持久化的日志数据。
  • redo log的写入过程:

    • 修改操作完成后,将数据页从内存缓冲到磁盘。
    • 在提交时,redo log buffer中的日志会被刷入磁盘。

    redo log的结构:

    • 每个日志块(redo log block)大小为512字节。
    • 包含日志块头(12字节)、日志块尾(8字节)和日志主体(492字节)。

    日志块头包含以下信息:

    • log_block_hdr_no:日志块在缓冲区的位置ID。
    • log_block_hdr_data_len:日志块已记录的大小。
    • log_block_first_rec_group:日志块中第一个记录的偏移位置。
    • log_block_trl_no:日志块的序列号。

    日志块尾用于验证日志块的完整性。

    1.3 日志块(log block

    redo log以日志块为单位存储,大小为512字节。每个日志块包含:

    • 约束条件记录(redo_log_type):表示日志类型。
    • 表空间ID(space):记录表空间的ID。
    • 页偏移量(page_no):表示数据页的偏移量。
    • 约束条件日志体(redo_log_body):记录实际的修改内容。

    1.4 log group与redo log file

    log group由多个大小相同的redo log file组成。每个组默认包含2个文件,文件大小由innodb_log_file_size变量决定。

    log group的写入规则:

    • 首先写入第一个文件(ib_logfile0),当文件满载时切换到第二个文件(ib_logfile1)。
    • 当第二个文件满载时,第一个文件会被清空部分空间,继续写入。

    1.5 redo log的格式

    redo log记录的是数据页的物理变化。每个日志块的日志主体部分包含:

    • 约束条件记录(1字节)。
    • 表空间ID(可压缩,4字节)。
    • 页偏移量(可压缩,4字节)。
    • 约束条件日志体(492字节)。

    1.6 日志刷盘规则

    日志刷盘的规则:

  • 提交时刷盘。
  • 每秒刷盘一次(由innodb_flush_log_at_timeout控制)。
  • 当缓冲区内存占用超过一半时刷盘。
  • 在检查点时刷盘。
  • innodb_flush_log_at_trx_commit变量控制提交时的刷盘策略:

    • 值为1:每提交一次事务就刷盘。
    • 值为0:每秒刷盘一次。
    • 值为2:每提交一次事务只写入缓冲区,定时刷盘。

    1.7 数据页刷盘规则及检查点

    数据页的刷盘(脏页刷盘)与日志刷盘不同,只有在检查点时才会刷盘。检查点触发时:

    • 脏页刷盘。
    • 脏日志刷盘。

    undo log的恢复速度快于binlog,因为undo log记录的是逻辑操作,而binlog记录的是物理操作。

    2. undo log

    2.1 基本概念

    undo log用于提供回滚和多版本控制(MVCC)。每个undo log记录包含事务ID和指针。

    undo log的存储方式:

    • 以段为单位存储,每个段包含1024个undo log记录。
    • 默认存放在共享表空间中。

    2.2 和undo log相关的变量

    • innodb_undo_logs:默认为128,控制回滚段数量。
    • innodb_undo_directory:默认为数据目录。
    • innodb_undo_tablespaces:默认为0,控制undo表空间数量。

    undo log的记录机制:

    • 插入操作不需要记录。
    • 删除操作记录对应的插入操作。
    • 更新操作记录对应的逆操作。

    3. binlog与事务日志的先后顺序及group commit

    在提交时,二进制日志先于redo log写入磁盘。binlogredo log的写入机制:

  • Flush阶段:将binlog写入内存。
  • Sync阶段:将内存中的binlog刷盘。
  • Commit阶段:执行redo logundo log的刷盘。
  • group commit优化:

    • 将多个事务的binlog一次性刷盘,提升性能。
    • MySQL5.6引入了新的机制,确保在binlogredo log同时支持group commit

    通过合理设置sync_binloginnodb_flush_log_at_trx_commit变量,可以优化日志刷盘性能。

    上一篇:【mysql】MYSQL的日志(redo log,binlog)顺序读写,数据文件随机读写以及linux底层原理
    下一篇:【mysql】事务隔离与mvcc的误区

    发表评论

    最新留言

    留言是一种美德,欢迎回访!
    [***.207.175.100]2025年05月11日 00时50分14秒

    关于作者

        喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
    -- 愿君每日到此一游!

    推荐文章

    cad模糊查询符号_mysql 正则模式和like模糊查询 2023-01-24
    continue可以用if判断里面吗_谁能说说if()else()里的continue是干嘛的? 2023-01-24
    ctrl c 和 ctrl v 不能用了_神奇操作,原来CTRL键还能这么用 2023-01-24
    cytoscape安装java_Cytoscape史上最全攻略 2023-01-24
    c语言程序设计年历显示,C语言程序设计报告《万年历》.doc 2023-01-24
    C语言程序设计梁海英答案,1.5 习题 2023-01-24
    c语言编写单片机中断,C语言AVR单片机中断程序写法 2023-01-24
    #pragma region、{} 2023-01-24
    ddr2的上电顺序_S5PV210 DDR2初始化 28个步骤总结 2023-01-24
    deque stack java_「集合系列」- 初探 java 集合框架图 2023-01-24
    easyexcel 导出 代码翻译converter_【starter推荐】简单高效Excel 导出工具 2023-01-24
    echarts 如何在一条柱形显示两个数字_干货 | 如何快速制作数据地图?让你的可视化逼格再高一级!... 2023-01-24
    eclipse设置utf8编码_记住没:永远不要在 MySQL 中使用 UTF8 2023-01-24
    eclipse里source的快捷方法_Eclipse快捷键/快捷操作汇总 2023-01-24
    elasticsearch 查询_Elasticsearch地理信息存储及查询之Geo_Point 2023-01-24
    embedding层_【预估排序】Embedding+MLP: 深度学习预估排序通用框架(一) 2023-01-24
    excel中最常用的30个函数_Excel玩转数据分析常用的43个函数! 2023-01-24
    flink sql设置并行度_Flink 参数配置和常见参数调优 2023-01-24
    go 字符串替换_Go 每日一库之 quicktemplate 2023-01-24
    hex editor neo下载_口袋妖怪爆焰黑手机版下载-口袋妖怪爆焰黑手游下载v4.3.0 安卓版... 2023-01-24