MySQL:binlog的写入机制

其实,binlog 的写入逻辑比较简单:事务执行过程中,先把日志写到 binlog cache,事务提交的时候,再把 binlog cache 写到 binlog 文件中。

一个事务的 binlog 是不能被拆开的,因此不论这个事务多大,也要确保一次性写入。这就涉及到了 binlog cache 的保存问题。

系统给 binlog cache 分配了一片内存,每个线程一个,参数 binlog_cache_size 用于控制单个线程内 binlog cache 所占内存的大小。如果超过了这个参数规定的大小,就要暂存到磁盘。

事务提交的时候,执行器把 binlog cache 里的完整事务写入到 binlog 中,并清空 binlogcache。如下图所示。

可以看到,每个线程有自己 binlog cache,但是共用同一份 binlog 文件。

图中的 write,指的就是指把日志写入到文件系统的 page cache,并没有把数据持久化到磁盘,所以速度比较快。

图中的 fsync,才是将数据持久化到磁盘的操作。一般情况下,我们认为 fsync 才占磁盘的 IOPS。

write 和 fsync 的时机,是由参数 sync_binlog 控制的:

    1. sync_binlog=0 的时候,表示每次提交事务都只 write,不 fsync; •
    1. sync_binlog=1的时候,表示每次提交事务都会执行 fsync; •
    1. sync_binlog=N(N>1) 的时候,表示每次提交事务都write,但累积 N 个事务后才fsync。

因此,在出现 IO 瓶颈的场景里,将 sync_binlog 设置成一个比较大的值,可以提升性能。

在实际的业务场景中,考虑到丢失日志量的可控性,一般不建议将这个参数设成 0,比较常见的是将其设置为 100~1000 中的某个数值。

但是,将 sync_binlog 设置为 N,对应的风险是:如果主机发生异常重启,会丢失最近 N个事务的 binlog 日志。

相关推荐
gQ85v10Db13 分钟前
Redis分布式锁进阶第二十二篇
数据库·redis·分布式
薪火铺子13 分钟前
MySQL 锁机制与死锁分析深度解析
数据库·mysql
千百元16 分钟前
mysql5.7 定时删除表数据
mysql
曹牧1 小时前
Oracle:将包含属性(Attributes)的 XML 数据解析为表格数据
xml·数据库·oracle
@小匠1 小时前
Redis RDB持久化之 save 自动备份检查机制
数据库·redis·bootstrap
折哥的程序人生 · 物流技术专研1 小时前
从“卡死”到“跑通”:WMS机器学习全流程实战排坑记
数据库·人工智能·机器学习
上海云盾商务经理杨杨1 小时前
Web渗透核心漏洞:SQL注入漏洞测试与修复实战
数据库·sql·安全
2303_821287382 小时前
c++ RAII机制详解 c++如何利用RAII管理资源
jvm·数据库·python
小宇的天下2 小时前
Calibre 3Dstack --每日一个命令day25【no_trace】(3-25)
数据库
m0_624578593 小时前
C#怎么获取U盘的插拔事件_C#如何重写WndProc捕获消息【进阶】
jvm·数据库·python