Mysql之刷盘机制

一、刷盘机制总览

  • 刷盘过程

mysql刷脏数据在写redo之后,逻辑跟oracle一致。

checkpoint/commit -> 内存中的redo到redolog文件 -> 内存中的脏数据到数据盘。

但是mysql多一个环节,就是把binlog从binlog cache写入到binlog文件中。binlog cache不是共享内存,是为每个client分配的私有内存,是mysql server管理的。而log buffer是共享内存,由innodb管理,属于innodb存储引擎内存。

  • 刷盘参数

innodb_flush_logxxx是可能指刷redo也可能指刷binlog

innodb_xx_dirty_page_xx或者innodb_xx_page_xx是指的刷脏页的参数(buffer pool的脏页刷到磁盘中)

  • 刷日志最重要的参数有2个

1.innodb_flush_log_at_trx_commit刷log buffer的redo到log file中

2.sync_binlog刷binlog cache的事务到binlog文件中

两个参数的默认值都是1,表示提交即写log(redolog和binlog都写),也就是mysql日志双写。

二、刷盘的三个类型

落盘可以从3个方向分析

  • binlog

binlogcache是server为每个客户端分配的内存池,事务未提交前的数据放入binlogcache,提交后写入binlog日志文件。
刷binlog的重要参数就是sync_binlog,0表示关闭写binlog,1表示每次提交便写binlog到磁盘(默认),N(N>=2)表示binlog组提交,可能丢失数据。

  • redolog

redo在内存中存放在logbuffer,redo写入logfile是顺序循环写的,所以会比data写快(data一般是离散写)。
logbuffer的重要参数是innodb_flush_log_at_trx_commit。0表示每秒写入磁盘,可能会丢失事务;1表示每次提交就写入磁盘(默认);2表示提交或每秒写入磁盘,也不会丢失事务。(oracle的redo从redologbuffer到redo logfile:每3秒;每有提交;切换日志;1/3满或1MB。可以看出mysql跟oracle的redo落盘机制很类似,只是细节有些区别)

  • data

bufferpool中的有个change buffer,也就是”插入缓存“,缓存了二级索引的变更信息,通过合并写入二级索引减少离散IO以提高性能。
刷脏页一般发生在commit之后,redo和binlog提交之后。innodb可以根据脏页在bufferpool中的水位强制刷脏页。
Adaptive Flushing根据数据库负载情况调整刷每秒应该刷多少脏页。

原文链接:https://blog.csdn.net/qq_40687433/article/details/112540401

posted @   *一炁化三清*  阅读(347)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
点击右上角即可分享
微信分享提示