专栏首页立权的博客Mysql-innodb日志写入时机

Mysql-innodb日志写入时机

总所周知 , innodb 的日志是二阶段提交的,redolog 先在 prepare 阶段写入, binlog 再写入,最后 redolog commit

这其中 redolog 的刷入时机是由 innodb_flush_log_at_trx_commit 参数控制,有提交时不刷如,刷入操作系统缓存,落盘 3种操作。

binlog 的刷入时机是由 sync_binlog 参数控制的,设置为 N ,表示每 N 次事务提交 会刷入一次硬盘, 如果设置为 0 只会写入 os cache

具体的 ,innodb_flush_log_at_trx_commit 参数是在 prepare 控制 这个阶段写入的内容怎么刷硬盘

而 sync_binlog 参数控制的 就是 binlog 在 redolog 之后 的 写入

值得注意的是, redolog 在 commit 阶段是不会刷入硬盘,也不会写入 os cache,知识单纯写入内存。

因为 如果 binlog 完整, redolog prepare 阶段写入完成,则可以直接把事务提交掉,就算没有 commit 阶段的记录也行。

redolog 是每执行一条语句都会写入到 redolog buffer。在某个事务提交的时候一次性组提交,把buffer 所有的内容都刷盘。多个事务共享的是 redolog buffer

binlog 是每个线程都有自己的 binlog buffer, 线程每执行一条语句都会往这里写,当提交的时候再把 自己的 binlog buffer 写到 binlog 文件中。多个事务 共享的 是 binlog 文件

另外,innodb 的 redolog 提供了 组提交机制(指的是共享的 redo log buffer 成组写入)。假如有三个 事务,t1 , t2 , t3 ,同时提交,假设 t1 先进入到 刷硬盘的时机,他发现 buffer 中还有 t2 和 t3 的日志,会同时帮忙刷入到硬盘中(假如控制的参数是1的话)。称为组提交。其实 t2,t3 就算不提交,也会被 t1 顺带落盘,很奇怪?为什么没提交的事务的 redo log 也能落盘?其实还有 undo log , 从数据页可以找到 一条与之相关的 undo log 链。

记录了 数据页做出的变化。而 undo log 上记录了 事务的 id,可以找到对应事务。当崩溃恢复,机器重启时,虽然应用了硬盘中的未提交事务的 redolog,但是可以从 redolog 或者 其他地方找到 未提交的 事务,然后找到 对应的 undo log,进行回滚。

另外还有 binlog 的组提(binlog 的组提交是 多个线程 写入 binlog 的 os cache,某个线程 sync 把其他 线程写入 os cache 的内容 成组刷盘)。可以通过

binlog_group_commit_sync_delay 和 binlog_group_commit_sync_no_delay_count 两个参数 控制 binlog 刷盘的延后,使更多事务同时 fsync

前者代表一个 binlog 提交延迟多久后 才 fsync,后一个代表一个 binlog 提交之后经过再多少个 binlog 提交才 fsync

(后者和 sync_binlog 不矛盾, t1, t2, t3 依次提交,假如 sync_binlog = 1 , binlog_group_commit_sync_no_delay_count = 2,那么 t1 暂时不 fsync,t2,t3 提交之后再 fsync, t2,t3 已经刷了盘

已经不能再做为起点计数了,如果再来各 t4,则从t4 开始算起)

实际的提交流程流程 : redolog prepare 阶段写入 os cache - binlog 写入os cache - redolog 的 fsync 刷盘阶段(innodb_flush_log_at_trx_commit 控制是否刷盘)- binlog 的fsync 刷盘 - redolog 的commit 写入 buffer。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 栈论 : 递归与栈式访问,如何用栈实现所有递归操作(幼儿园题目篇,题目2)

    首先,因为父函数中对节点的读取是在子函数退出之后的(3在1和2之后),所以父函数的栈帧在子函数栈帧入栈时不能出栈(不能退出),要等待子函数出栈,

    执生
  • Redis 热键问题,缓存击穿,缓存穿透,缓存雪崩

    描述:热键被大量客户端访问,导致大量网络流量集中在一台Redis服务器上,服务器宕机。

    执生
  • JVM: 字节码-模板解释汇编 映射 / 栈上替换

      JVM 在解释模式下使用的比较多的是模板解释器,该解释器将每个字节码都用一段汇编代码表示,并且给出这段汇编代码的入口地址

    执生
  • 研发应该懂的binlog知识!

    大家当年在学MySQL的时候,为了能够迅速就业,一般是学习一下MySQL的基本语法,差不多就出山找工作了。水平稍微好一点的童鞋呢还会懂一点存储过程的编写,又或者...

    Java3y
  • Mysql误删恢复

    在配置文件中加入 log-bin 配置,表示启用binlog,如果没有给定值,写成 log-bin=,则默认名称为主机名。(注:名称若带有小数点,则只取第一个小...

    剑行者
  • MySQL binlog

    【转载请注明出处】:https://cloud.tencent.com/developer/article/1632663

    后端老鸟
  • MySQL Binlog实用攻略

    本文简要介绍 binlog 原理及其在恢复、复制中的使用方法,更多深入分析可参考 mysql 官方文档。

    腾讯数据库技术
  • 腾讯云 CDB : 深入解析 MySQL binlog

    本文简要介绍 binlog 原理及其在恢复、复制中的使用方法。

    腾讯云数据库 TencentDB
  • 生产Mysql数据库数据恢复实战过程

    mysql数据库一主多从的架构,主写从读进行读写分离,专用从库做数据备份,每天0点全备一次,12点增量备份一次,初始阶段数据量很小的情况按此方案,后续数...

    民工哥
  • Java进阶架构师必看:15次架构演进详解

    15次架构演进实战,让你清晰明白从一个中小企业的项目架构到一个大型互联网平台是如何进行架构演进过程的!

    艾编程

扫码关注云+社区

领取腾讯云代金券