当前位置: 首页 > news >正文

MYSQL的binlog

用于备份恢复主从复制

binlog 有 3 种格式类型,分别是 STATEMENT(默认格式)、ROW、 MIXED:

STATEMENT:每一条修改数据的 SQL 都会被记录到 binlog 中(相当于记录了逻辑操作,所以针对这种格式, binlog 可以称为逻辑日志),主从复制中 slave 端再根据 SQL 语句重现。但 STATEMENT 有动态函数的问题,比如你用了 uuid 或者 now 这些函数,你在主库上执行的结果并不是你在从库执行的结果,这种随时在变的函数会导致复制的数据不一致;

ROW:记录行数据最终被修改成什么样了(这种格式的日志,就不能称为逻辑日志了),不会出现 STATEMENT 下动态函数的问题。但缺点是每行数据的变化结果都会被记录,比如执行批量 update 语句,更新多少行数据就会产生多少条记录,使 binlog 文件过大,而在 STATEMENT 格式下只会记录一个 update 语句而已;

MIXED:包含了 STATEMENT 和 ROW 模式,它会根据不同的情况自动使用 ROW 模式和 STATEMENT 模式;

MySQL 给每个线程分配了一片内存用于缓冲 binlog ,该内存叫 binlog cache,参数 binlog_cache_size 用于控制单个线程内 binlog cache 所占内存的大小。如果超过了这个参数规定的大小,就要暂存到磁盘。虽然每个线程有自己的,但是最终都写到同一个 binlog 文件

图中的 write,指的就是指把日志写入到 binlog 文件,但是并没有把数据持久化到磁盘,因为数据还缓存在文件系统的 page cache 里,write 的写入速度还是比较快的,因为不涉及磁盘 I/O。

图中的 fsync,才是将数据持久化到磁盘的操作,这里就会涉及磁盘 I/O,所以频繁的 fsync 会导致磁盘的 I/O 升高。

MySQL提供一个 sync_binlog 参数来控制数据库的 binlog 刷到磁盘上的频率:

sync_binlog = 0 的时候,表示每次提交事务都只 write,不 fsync,后续交由操作系统决定何时将数据持久化到磁盘;

sync_binlog = 1 的时候,表示每次提交事务都会 write,然后马上执行 fsync

sync_binlog =N(N>1) 的时候,表示每次提交事务都 write,但累积 N 个事务后才 fsync

MySQL怎么知道binlog是否完整?

  • statement 格式的 binlog,最后会有 COMMIT;
  • row 格式的 binlog,最后会有一个 XID event。

相关文章:

  • 《棒球规则》全明星比赛规则·棒球1号位
  • 爱普生FC1610BN晶体在健康监测手环的应用
  • 使用Python设置excel单元格的字体(font值)
  • JavaScript 扩展Array类方法实现数组求和
  • 【网络应用程序设计】实验一:本地机上的聊天室
  • 代码随想录训练营38天 || 322. 零钱兑换 279. 完全平方数 139. 单词拆分
  • 从零开始学习MySQL的系统学习大纲
  • HCIP(综合实验2)
  • 每日算法-哈希表(两数之和、)
  • el-table表格既出现横向滚动条,又出现纵向滚动条?
  • YOLOv8非常详细的模型的训练两种方式
  • 文件上传漏洞2
  • <四级英语词汇> 2025.4.22
  • Cursor Free VIP 重置进程错误,轻松恢复使用!
  • 三网通电玩城平台系统结构与源码工程详解(四):子游戏集成与服务器调度机制全解
  • Java学习手册:RESTful API 设计原则
  • MQ底层原理
  • 强化学习笔记(四)——SARSA、Q-learning
  • 伪谱法求解最优控制问题(附Python代码)
  • Lustre/Scade 与 IEC 61131-3 相似的方面及差异
  • 助力中国足球未来,香港赛马会鼎力支持U15国少选拔队赴英训练
  • 文旅部:今年中国旅游日活动合作单位扩大至60多家
  • 第1现场|俄乌互指对方违反复活节临时停火提议
  • 能上天入海的“鲲龙”毕业了,AG600取得型号合格证
  • 华夏幸福:累计未能如期偿还债务金额合计为227.91亿元
  • 《黄雀》:从“大案猎奇”向“民生写实”转变