您的位置:首页技术文章
文章详情页

MySQL三大日志(binlog、redo log和undo log)图文详解

【字号: 日期:2023-02-18 16:43:24浏览:46作者:猪猪
目录
  • 1.redo log
    • redo log概述
    • 刷盘时机
      • innodb_flush_log_at_trx_commit=0
      • innodb_flush_log_at_trx_commit=1
      • innodb_flush_log_at_trx_commit=2
    • 日志文件组
    • 2.binlog binlog
      • 概述
        • 记录格式
          • 写入机制
            • 刷盘时机
            • 3.两阶段提交
              • 4.undo log
                • 5.总结
                  • 总结

                    1.redo log

                    redo log概述

                    redo log(重做日志)是InnoDB存储引擎独有的,它让MySQL拥有了崩溃恢复能力。

                    比如 MySQL 实例挂了或宕机了,重启时,InnoDB存储引擎会使用redo log恢复数据,保证数据的持久性与完整性。

                    MySQL 中数据是以页为单位,你查询一条记录,会从硬盘把一页的数据加载出来,加载出来的数据叫数据页,会放入到 Buffer Pool 中。

                    后续的查询都是先从 Buffer Pool 中找,没有命中再去硬盘加载,减少硬盘 IO 开销,提升性能。

                    更新表数据的时候,也是如此,发现 Buffer Pool 里存在要更新的数据,就直接在 Buffer Pool 里更新。

                    然后会把“在某个数据页上做了什么修改”记录到重做日志缓存(redo log buffer)里,接着刷盘到 redo log 文件里。

                    刷盘时机

                    InnoDB 存储引擎为 redo log 的刷盘策略提供了 innodb_flush_log_at_trx_commit 参数,它支持三种策略:

                    • 0 :设置为 0 的时候,表示每次事务提交时不进行刷盘操作
                    • 1 :设置为 1 的时候,表示每次事务提交时都将进行刷盘操作 (默认值)
                    • 2 :设置为 2 的时候,表示每次事务提交时都只把 redo log buffer 内容写入 page cache

                    另外,InnoDB 存储引擎有一个后台线程,每隔1 秒,就会把 redo log buffer 中的内容写到文件系统缓存(page cache),然后调用 fsync 刷盘。

                    也就是说,一个没有提交事务的 redo log 记录,也可能会刷盘

                    标签: MySQL