不会吧,不会吧,还有人不知道 binlog ?
本文读完需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,才是将数据持久化到磁盘的操作
write
和fsync
的时机,可以由参数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 ?相关推荐
- InnoDB原理篇:Change Buffer是如何提升索引性能的?
前言 相信很多小伙伴设计索引时,考虑更多的是索引是否能覆盖大部分的业务场景,却忽略了索引的性能. 什么?不同的索引,性能还不一样? 是的,这要从change buffer说起. Change Bu ...
- Java学习专栏!全网最牛!
Java基础系列 001:<快速深入理解JDK动态代理原理> 002:<这可能是你见过最全面的HashMap解读> 003:<我敢打赌你一定没用过 Java 中的这个类! ...
- 院士谈如何做好研究生:要逼着自己去想问题,最大的浪费是聪明人不思考
来源:中国科学报.中国科学院大学.百度百科 本文仅用于学术分享,转载请注明出处.若有侵权,请联系删除或修改! 临近开学季,不少导师也陷入了焦虑,那么作为研究生,该如何利用好新学期在科研上做出成绩呢?今 ...
- 孙正义真会玩,这个「人不是人,狗不是狗」的画面,价值上千万
白交 发自 凹非寺 量子位 报道 | 公众号 QbitAI 孙正义真会玩. 他的「狗」和「人」组建了一个啦啦队,画面是这样的. 一看到那么多波士顿动力机器狗组建一个啦啦队,一只53万-- 啊-肉疼. ...
- 什么样的人不适合做SEO呢
seo工作和其他的工作实在是太不一样了,这也导致了很多人其实并不适合这个工作,不是说做不来,而是做不好.那么那些人是不适合的呢? 一 太聪明的人 做seo需要简单的人,如果你是一张白纸,学习到以后会马 ...
- 通信专业学python有用吗-通信人不会这项技能,5G时代很难拿到高薪
原标题:通信人不会这项技能,5G时代很难拿到高薪 得数据者,得天下. 数字的价值,在今天越来越明显.但依然有很多人觉得,那些只是公司和组织才应该重视和追逐的. 因为它可以帮助企业找到商机,找到客户,找 ...
- python发明者叫什么-编程语言简史:有人不喜欢花括号,于是他发明了 Python
原标题:编程语言简史:有人不喜欢花括号,于是他发明了 Python 经常有人会说,怎么样才能在和别人竞争岗位的过程中生胜出,又怎么样才能和老板提出要涨薪的要求,这就不得不提到核心竞争力了,那到底什么才 ...
- 移动的验证码安全问题告诉移动网站后......,1860意指一般人不会这样做.
在发布"验证码的思考,你的验证码安全吗? "之前,已经给移动网站管理员发过一封信,但其没有回信.但由于我已经在上文中提到了移动网站的验证码有问题,所以还是打电话给10086,告诉其问题所在. 今天早上 ...
- 互联网人不敢生孩子:加班多、想跳槽、怕被边缘化
我们部门里17个女生,只有一个人生孩子,大家都觉得她很有勇气. 作者 | 唐亚华 苏琦 李秋涵 金玙璠 梁丽爽 周继凤 魏婕 有一种压力,叫互联网人不敢怀孕. 大多数人生孩子前的压力在于,互联网公司加 ...
最新文章
- mysql+性能优化+命令_MySQL 性能优化及常用命令
- 通过关闭UseDNS和GSSAPIAuthentication选项加速SSH登录
- Spring Security HttpSecurity
- Ghost for linux 工具备份还原系统
- 第十九:如何在Windows下把Allure2与Jenkins的集成生成自定义的测试报告(重点超详细)
- eclipse java 源代码,java – 下载Eclipse源代码
- C语言求素数的几种方法
- 计算机睡眠和休眠的区别win10,win10睡眠和休眠有何不同_win10休眠和睡眠的区别...
- pyqt5 QListWidget的使用
- 《三体》与《西部世界》
- woocommerce-paypal-payments/modules/ppcp-button/src/Assets/SmartButton.php如何解决AVADA主题
- Web的组成架构模型
- [附源码]计算机毕业设计Python蛋糕购物商城(程序+源码+LW文档)
- VC++操作Excel 2007
- 《第一行代码》第三版笔记
- “智慧之城”如何构建数据根基,打造数据治理新样本-亿信华辰
- 利用计算机网络盗窃,利用计算机病毒盗窃网络虚拟财产行为定性分析
- 背包问题一百块最少硬币数
- R中安装Rattle包的步骤
- Redis 主从复制、哨兵模式、集群
热门文章
- gis 大屏_胡中南:Web端GIS技术新进展 | (PPT+速记)
- 新手学stm32学f1还是f4,stm32初学者最好买哪种开发板?
- 【Java】排序算法 之 【归并排序】 总结
- java office 集成开发_Office文件格式突变,促使Java和Office更完美集成
- 中双目运算符_C++日志(四十)教你如何以非成员函数的形式重载运算符
- access汇总含义_2020最新大厂内部 PHP 高级工程师面试题汇总(二)
- k8s的imagePullSecrets如何生成及使用
- 关于Oracle 的url 连接 最后一个orcl的理解
- Android SDK与API版本的对应关系
- 《Visual C++ 开发从入门到精通》——2.7 变量