本文读完需7分钟,速读仅需4分钟。

前言

上篇阿星详细聊了redo log(重做日志),但是在MySQL数据库中还有一种二进制日志叫binlog(归档日志)。

redo log它是物理日志,记录内容是“在某个数据页上做了什么修改”,属于InnoDB存储引擎。

binlog是逻辑日志,记录内容是语句的原始逻辑,类似于“给ID=2这一行的c字段加1”,属于MySQL Server层。

binlog

不管用什么存储引擎,只要发生了表数据更新,都会产生binlog日志。

binlog到底是用来干嘛的?

可以说MySQL数据库的数据备份、主备、主主、主从都离不开binlog,需要依靠binlog来同步数据,保证数据一致性。

binlog会记录所有涉及更新数据的逻辑操作,并且是顺序写。

记录格式

binlog日志有三种格式,可以通过binlog_format参数指定。

  • statement

  • row

  • mixed

指定statement,记录的内容是SQL语句原文,比如执行一条update T set update_time=now() where id=1,记录的内容如下。

同步数据时,会执行记录的SQL语句,但是有个问题,update_time=now()这里会获取当前系统时间,直接执行会导致与原库的数据不一致。

为了解决这种问题,我们需要指定为row,记录的内容不再是简单的SQL语句了,还包含操作的具体数据,记录内容如下。

row格式记录的内容看不到详细信息,要通过mysqlbinlog工具解析出来。

update_time=now()变成了具体的时间update_time=1627112756247,条件后面的@1、@2、@3都是该行数据第1个~3个字段的原始值(假设这张表只有3个字段)。

这样就能保证同步数据的一致性,通常情况下都是指定为row,这样可以为数据库的恢复与同步带来更好的可靠性。

但是这种格式,需要更大的容量来记录,比较占用空间,恢复与同步时会更消耗IO资源,影响执行速度。

所以就有了一种折中的方案,指定为mixed,记录的内容是前两者的混合。

MySQL会判断这条SQL语句是否可能引起数据不一致,如果是,就用row格式,否则就用statement格式。

写入机制

binlog的写入时机也非常简单,事务执行过程中,先把日志写到binlog cache,事务提交的时候,再把binlog cache写到binlog文件中。

因为一个事务的binlog不能被拆开,无论这个事务多大,也要确保一次性写入,所以系统会给每个线程分配一个块内存作为binlog cache

我们可以通过binlog_cache_size参数控制单个线程binlog cache大小,如果存储内容超过了这个参数,就要暂存到磁盘(Swap)。

binlog日志刷盘流程如下

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

  • 上图的fsync,才是将数据持久化到磁盘的操作

writefsync的时机,可以由参数sync_binlog控制,默认是0

0的时候,表示每次提交事务都只write,由系统自行判断什么时候执行fsync

虽然性能得到提升,但是机器宕机,page cache里面的binglog会丢失。

为了安全起见,可以设置为1,表示每次提交事务都会执行fsync,就如同binlog日志刷盘流程一样。

最后还有一种折中方式,可以设置为N(N>1),表示每次提交事务都write,但累积N个事务后才fsync

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

同样的,如果机器宕机,会丢失最近N个事务的binlog日志。

站在巨人的肩膀上

  • 《MySQL实战45讲》

  • 《从零开始带你成为MySQL实战优化高手》

  • 《MySQL技术Innodb存储引擎》

不会吧,不会吧,还有人不知道 binlog ?相关推荐

  1. InnoDB原理篇:Change Buffer是如何提升索引性能的?

    前言 相信很多小伙伴设计索引时,考虑更多的是索引是否能覆盖大部分的业务场景,却忽略了索引的性能. 什么?不同的索引,性能还不一样? 是的,这要从change buffer说起.   Change Bu ...

  2. Java学习专栏!全网最牛!

    Java基础系列 001:<快速深入理解JDK动态代理原理> 002:<这可能是你见过最全面的HashMap解读> 003:<我敢打赌你一定没用过 Java 中的这个类! ...

  3. 院士谈如何做好研究生:要逼着自己去想问题,最大的浪费是聪明人不思考

    来源:中国科学报.中国科学院大学.百度百科 本文仅用于学术分享,转载请注明出处.若有侵权,请联系删除或修改! 临近开学季,不少导师也陷入了焦虑,那么作为研究生,该如何利用好新学期在科研上做出成绩呢?今 ...

  4. 孙正义真会玩,这个「人不是人,狗不是狗」的画面,价值上千万

    白交 发自 凹非寺  量子位 报道 | 公众号 QbitAI 孙正义真会玩. 他的「狗」和「人」组建了一个啦啦队,画面是这样的. 一看到那么多波士顿动力机器狗组建一个啦啦队,一只53万-- 啊-肉疼. ...

  5. 什么样的人不适合做SEO呢

    seo工作和其他的工作实在是太不一样了,这也导致了很多人其实并不适合这个工作,不是说做不来,而是做不好.那么那些人是不适合的呢? 一 太聪明的人 做seo需要简单的人,如果你是一张白纸,学习到以后会马 ...

  6. 通信专业学python有用吗-通信人不会这项技能,5G时代很难拿到高薪

    原标题:通信人不会这项技能,5G时代很难拿到高薪 得数据者,得天下. 数字的价值,在今天越来越明显.但依然有很多人觉得,那些只是公司和组织才应该重视和追逐的. 因为它可以帮助企业找到商机,找到客户,找 ...

  7. python发明者叫什么-编程语言简史:有人不喜欢花括号,于是他发明了 Python

    原标题:编程语言简史:有人不喜欢花括号,于是他发明了 Python 经常有人会说,怎么样才能在和别人竞争岗位的过程中生胜出,又怎么样才能和老板提出要涨薪的要求,这就不得不提到核心竞争力了,那到底什么才 ...

  8. 移动的验证码安全问题告诉移动网站后......,1860意指一般人不会这样做.

    在发布"验证码的思考,你的验证码安全吗? "之前,已经给移动网站管理员发过一封信,但其没有回信.但由于我已经在上文中提到了移动网站的验证码有问题,所以还是打电话给10086,告诉其问题所在. 今天早上 ...

  9. 互联网人不敢生孩子:加班多、想跳槽、怕被边缘化

    我们部门里17个女生,只有一个人生孩子,大家都觉得她很有勇气. 作者 | 唐亚华 苏琦 李秋涵 金玙璠 梁丽爽 周继凤 魏婕 有一种压力,叫互联网人不敢怀孕. 大多数人生孩子前的压力在于,互联网公司加 ...

最新文章

  1. mysql+性能优化+命令_MySQL 性能优化及常用命令
  2. 通过关闭UseDNS和GSSAPIAuthentication选项加速SSH登录
  3. Spring Security HttpSecurity
  4. Ghost for linux 工具备份还原系统
  5. 第十九:如何在Windows下把Allure2与Jenkins的集成生成自定义的测试报告(重点超详细)
  6. eclipse java 源代码,java – 下载Eclipse源代码
  7. C语言求素数的几种方法
  8. 计算机睡眠和休眠的区别win10,win10睡眠和休眠有何不同_win10休眠和睡眠的区别...
  9. pyqt5 QListWidget的使用
  10. 《三体》与《西部世界》
  11. woocommerce-paypal-payments/modules/ppcp-button/src/Assets/SmartButton.php如何解决AVADA主题
  12. Web的组成架构模型
  13. [附源码]计算机毕业设计Python蛋糕购物商城(程序+源码+LW文档)
  14. VC++操作Excel 2007
  15. 《第一行代码》第三版笔记
  16. “智慧之城”如何构建数据根基,打造数据治理新样本-亿信华辰
  17. 利用计算机网络盗窃,利用计算机病毒盗窃网络虚拟财产行为定性分析
  18. 背包问题一百块最少硬币数
  19. R中安装Rattle包的步骤
  20. Redis 主从复制、哨兵模式、集群

热门文章

  1. gis 大屏_胡中南:Web端GIS技术新进展 | (PPT+速记)
  2. 新手学stm32学f1还是f4,stm32初学者最好买哪种开发板?
  3. 【Java】排序算法 之 【归并排序】 总结
  4. java office 集成开发_Office文件格式突变,促使Java和Office更完美集成
  5. 中双目运算符_C++日志(四十)教你如何以非成员函数的形式重载运算符
  6. access汇总含义_2020最新大厂内部 PHP 高级工程师面试题汇总(二)
  7. k8s的imagePullSecrets如何生成及使用
  8. 关于Oracle 的url 连接 最后一个orcl的理解
  9. Android SDK与API版本的对应关系
  10. 《Visual C++ 开发从入门到精通》——2.7 变量