谈谈MySQL bin log的写入机制、以及线上的参数是如何配置的
问个问题吧!为什么你需要了解binlog的落盘机制呢?
我来回答一下:
上一篇文章提到了生产环境中你可以使用binlog做数据的恢复、审计、以及搭建主从架构的MySQL集群。那你使用这些特性优势的时候有没有问自己一下,你使用的binlog是安全的吗?会不会少记录了一部分数据呢?因为使用一个有问题的binlog去做数据恢复、审计、搭建主从MySQL集群的结果肯定是错误的!
下面,我们一起来看一下MySQL执行事物的过程中 binlog 的落盘机制。MySQL是如何保证你使用的binlog是安全的!
一、binlog 的高速缓存
首先为大家介绍一个概念:binlog的高速缓存
意思是:所有未commit的事物产生的binlog,都会被先记录到binlog的高速缓存中。等该事物被commit时,再将缓存中的数据写入binlog日志文件中。
高速缓存的大小可以由参数binlog_chache_size
默认大小为:32768 ,并且每个session都有自己的独立的缓存。多个会话指间彼此不影响。
binlog_chache_size
不能设置太大,否则大量事物打来后肯定会造成宝贵的内存资源被浪费。但是也别太小,因为当一个事物产生的日志足够大超过该参数设置的值时,MySQL会将缓存中的binlog数据写到临时文件中去。
看到这里我们已经知道了binlog会写入缓存中,并且我们可以通过上述参数动态调整该缓冲。别急,继续往看下,binlog何时被写入磁盘呢?
二、刷盘机制
其实binlog写入磁盘的机制由参数sync_binlog
控制。
策略1:
sync_binlog = 0
当设置
sync_binlog = 0
时,表示innodb不会主动控制将binlog落盘,innodb仅仅会将binlog写入到OS Cache中,至于什么时间将binlog刷入磁盘中完全依赖于操作系统。选这种策略,一旦操作系统宕机,OS Cache中的binlog就会丢失。策略2:
sync_binlog = 1
设置
sync_binlog = 1
时,表示事物commit时将binlog落盘!这样哪怕机器宕机了,也能确保binlog会被写入到磁盘中。
你有没有觉得当我说:“当事物commit时将binlog落盘” ,这句话很模糊???
是的!如果你仔细品一品,这句话真的很模糊!
当然了,虽然模糊,但是上面说的策略2并没有错误(MySQL官网也是这样描述的)
为了不偏离本篇文章的主线,本篇暂时不详细展开讲 sync_binlog=1 的细节。
我计划放在第 X 篇文章,“能谈谈MySQL的两阶段提交吗?” 详细展开,欢迎关注,敬请期待!
策略3:
sync_binlog=N
这里的N不是0,也不是1。
当N大于1时,表示开启组提交,也就是group commit,如果你之前不层了解组提交的话,你可以这样理解它:比如N=5,那MySQL就会等收集5个binlog后再将这5个binlog一口气同步到磁盘上。好处很明显,一次IO可以往磁盘上刷入N个binlog,IO效率会有所提升。坏处也很明显,比如N=5,那当MySQL收集了4个binlog时,服务器宕机,这4个binlog就会丢失。
三、推荐的策略
线上环境中,推荐将日志的刷盘策略设置成下图这这样。
这是也官方推荐的配置策略。这两个参数前面都已经提到过了,想必为什么这么设置,你已经很清楚了!
参考:
https://dev.mysql.com/doc/refman/5.7/en/replication-options-binary-log.html
https://dev.mysql.com/doc/refman/5.7/en/innodb-parameters.html#sysvar_innodb_flush_log_at_trx_commit
推荐阅读
- 大家常说的基数是什么?(已发布)
- 讲讲什么是慢查!如何监控?如何排查?(已发布)
- 对NotNull字段插入Null值有啥现象?(已发布)
- 能谈谈 date、datetime、time、timestamp、year的区别吗?(已发布)
- 了解数据库的查询缓存和BufferPool吗?谈谈看!(已发布)
- 你知道数据库缓冲池中的LRU-List吗?(已发布)
- 谈谈数据库缓冲池中的Free-List?(已发布)
- 谈谈数据库缓冲池中的Flush-List?(已发布)
- 了解脏页刷回磁盘的时机吗?(已发布)
- 用十一张图讲清楚,当你CRUD时BufferPool中发生了什么!以及BufferPool的优化!(已发布)
- 听说过表空间没?什么是表空间?什么是数据表?(已发布)
- 谈谈MySQL的:数据区、数据段、数据页、数据页究竟长什么样?了解数据页分裂吗?谈谈看!(已发布)
- 谈谈MySQL的行记录是什么?长啥样?(已发布)
- 了解MySQL的行溢出机制吗?(已发布)
- 说说fsync这个系统调用吧! (已发布)
- 简述undo log、truncate、以及undo log如何帮你回滚事物! (已发布)
- 我劝!这位年轻人不讲MVCC,耗子尾汁! (已发布)
- MySQL的崩溃恢复到底是怎么回事? (已发布)
- MySQL的binlog有啥用?谁写的?在哪里?怎么配置 (已发布)
- MySQL的bin log的写入机制 (已发布)
谈谈MySQL bin log的写入机制、以及线上的参数是如何配置的的更多相关文章
- mysql bin log配置及查看
mysql执行sql可以通过设置mysql bin 日志进行记录查看 mysql bin日志配置如下: log_bin:on log_bin_basename:bin文件路径及名前缀(/var ...
- 转载:MySQL:亲测备份策略实例(线上真实备份案例)
是否为线上库的备份而烦恼过,这里提供一个完整的备份从属数据库的备份方案,亲测可用 说明: 备份从库,按周计,每周进行一次全备 每周一的早上六点进行全备,其他时间备份中继日志 在从库上启用rsync服务 ...
- mysql bin log日志
装mysql,运行一段时间后,在mysql目录下出现一堆类似mysql-bin.000***,从mysql-bin.000001开始一直排列下来,而且占用了大量硬盘空间,高达几十个G. 对于这些超大空 ...
- [转帖]Mysql 最简单的参数调优配置
http://blog.jobbole.com/113659/ 我并不期望成为一个专家级的 DBA,但是,在我优化 MySQL 时,我推崇 80/20 原则,明确说就是通过简单的调整一些配置,你可以压 ...
- 记一次排查线上MySQL死锁过程,不能只会curd,还要知道加锁原理
昨晚我正在床上睡得着着的,突然来了一条短信. 啥,线上MySQL死锁了,我赶紧登录线上系统,查看业务日志. 能清楚看到是这条insert语句发生了死锁. MySQL如果检测到两个事务发生了死锁,会回滚 ...
- 深入学习MySQL 02 日志系统:bin log,redo log,undo log
上一篇文章中,我们了解了一条查询语句的执行过程,按理说这篇应该讲一条更新语句的执行过程,但这个过程比较复杂,涉及到了好几个日志与事物,所以先梳理一下3个重要的日志,bin log(归档日志).redo ...
- 转-->>mysql的bin log
binlog 基本认识 MySQL的二进制日志可以说是MySQL最重要的日志了,它记录了所有的DDL和DML(除了数据查询语句)语句,以事件形式记录,还包含语句所执行的消耗的时间,MySQL的二进制日 ...
- MySQL日志系统bin log、redo log和undo log
MySQL日志系统bin log.redo log和undo log 今人不见古时月,今月曾经照古人. 简介:日志是MySQL数据库的重要组成部分,记录着数据库运行期间各种状态信息,主要包括错误日 ...
- 【Mysql】三大日志 redo log、bin log、undo log
@ 目录 redo log(物理日志\重做日志) binlog(逻辑日志/归档日志) update语句执行流程 Uodolog(回滚日志/重做日志) undo log+redo log保证持久性 re ...
随机推荐
- RTSP服务端开发概述
一 概述 RTSP(Real Time Streaming Protocol),RFC2326,实时音视频流传输协议,是TCP/IP协议体系中的一个应用层协议.该协议定义了一对多应用程序如何有效地通过 ...
- IP地址分类的计算方法
IP地址由四段组成,每个字段是一个字节,8位,最大值是255,但实际中我们用点分十进制记法. IP地址由两部分组成,即网络地址和主机地址.网络地址表示其属于互联网的哪一个网络(常见ABC三类,以固定网 ...
- git 强制更新本地和强制提交覆盖
强制更新覆盖本地: git pull时出现冲突 放弃本地修改,使远程库内容强制覆盖本地代码git fetch --all //只是下载代码到本地,不进行合并操作git reset --hard ori ...
- java中高级面试利器(boot,cloud,vue前后端提升)
https://github.com/Snailclimb/JavaGuide Java知识大全(面试) https://github.com/doocs/advanced-java Java工 ...
- 深度分析:java设计模式中的原型模式,看完就没有说不懂的
前言 原型模式(Prototype模式)是指:用原型实例指定创建对象的种类,并且通过拷贝这些原型,创建新的对象 原型模式是一种创建型设计模式,允许一个对象再创建另外一个可定制的对象,无需知道如何创建的 ...
- Shamir秘密共享方案 (Python)
Shamir's Secret Sharing scheme is an important cryptographic algorithm that allows private informati ...
- Arduion学习(三)驱动温度传感器
一.实验目的: 1.将温度值打印显示在串口监视器 1.将温度值打印显示在串口,不同温度段显示不同的灯光,并在温度过高或过低时利用蜂鸣器报警. 二.实验准备: 1.查阅相关资料,了解本次实验所用到的引脚 ...
- T-SQL——基础语法
目录 0. 定义变量 1. 批处理 2. 条件逻辑--IF 3. 逻辑分支--CASE 4. 循环语句--WHILE 5. 附录--关于CASE表达式的实现函数 6. 参考 shanzm-2020年1 ...
- 手写koa-static源码,深入理解静态服务器原理
这篇文章继续前面的Koa源码系列,这个系列已经有两篇文章了: 第一篇讲解了Koa的核心架构和源码:手写Koa.js源码 第二篇讲解了@koa/router的架构和源码:手写@koa/router源码 ...
- PyQt(Python+Qt)学习随笔:字体writingSystem、ProportionalFonts、MonospacedFonts的含义以及QFontComboBox字体组合框详解
专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 一.引言 在介绍QFontComboBox之前,我们先简单介绍一下字体 ...