一、上节回顾

上节我们讲到,建议将 redo log 的刷盘策略设置为1:即提交事务时,强制将 redo log buffer 里的 redo log 刷入到磁盘后才算事务提交成功。

但是我们都知道,redo log buffer 是 InnoDB 存储引擎的组件,而 MySQL 支持很多种存储引擎,那么 MySQL 在撇除存储引擎后,自己就没有记录一下关于数据更新的日志吗?

二、binlog 日志文件

redo log 本身是 InnoDB 存储引擎特有的一个东西,所以 MySQL 也提供了一种所有存储引擎共享的日志文件,叫 binlog

所以在提交事务时,不但会有 rodo log,还有会 binlog 产生。

binlog 写入到哪里?

由于 binlog 不是 innoDB 存储引擎特有的组件,所以 binlog 不会像 redo log 一样先写入到缓冲池中的 redo log buffer 组件然后再刷回到磁盘中,所以应该是直接写入磁盘中。

binlog 的刷盘策略?

binlog 也有刷盘策略,那么就是说,binlog 并不一定是直接写入磁盘文件中。

binlog 的刷盘策略由参数 sync_binlog 参数控制。默认值是0,提交事务时,会将 binlog 写入 os cache 内存缓存中。但是这样会出现 MySQL 宕机导致内存缓存中的 binlog 丢失的问题。

所以我们建议将 sync_binlog 的值设置为1。此时当你提交事务时,会强制将 binlog 写入磁盘文件中,就不会出现上面数据丢失的情况了。

三、基于 redo log 和binlog 的事务提交

上面讲到,我们都是建议在事务提交时,强制将 redo logbinlog 刷入磁盘文件中,保证事务提交后,不存在日志丢失的问题。

那么,这两个日志在事务提交时的原理是怎么样的呢?

①、首先会将 rodo log buffer 中的 redo log 刷回磁盘文件中,此时磁盘文件有了对应的 redo log 日志文件;

②、接着,执行器会将 binlog 也写入到磁盘文件中,此时磁盘文件中也有了对应的 binlog 日志文件;

③、最后,还会将 binlog 日志文件的名称和位置写入到 redo log 日志文件中,同时,会在 redo log 日志文件中加上一个 commit 标记。

四、为什么有了 MySQL 的 binlog ,还有 InnoDB 的 redo log?

binlog 主要用来做数据归档的,它是逻辑日志,主要记录偏向逻辑性的日志,类似于“对表 t 中的 id=1 的一行数据进行了更新操作,更新以后的值是什么”。

redo log 主要用来做 MySQL 崩溃后数据恢复,它是物理日志,主要记录偏向物理性的日志,类似于“对哪个数据页中的哪一个记录做了什么修改”。

redo log 是 InnoDB 存储引擎特有的,而 binlog 是 MySQL Server 的组件,所以是所有存储引擎共享的。

五、为什么最后要在 redo log 中加入 commit 标记?

上面也说到 redo log 是 InnoDB 存储引擎特有的,所以它一定能被保证写入到磁盘,但是 binlog 却是 MySQL Server 的组件,所以 InnoDB 存储引擎不能保证它一定能成功写入磁盘,所以需要 rodo logcommit 标记来表明 binlog 写入成功了。

那为什么要保证 binlog 成功写入磁盘呢?

因为需要保证数据的一致性。

我们假设没有 commit 标记:

提交事务时,redo log 写入成功,而 binlog 写入失败,但是 InnoDB 存储引擎并不知道 binlog 是否写入成功,然后返回成功。当利用 binlog 来做数据归档时,例如 MySQL 的主从复制就是利用 binlog 来做的,那此时会因为 binlog 日志的缺失,而导致主从的数据不一致。

但是如果加入 commit 标记了,只有当 redo log 中有 commit 标记才算事务提交成功,这样就能保证两个日志文件的一致性了。

【大白话系列】MySQL 学习总结 之 初步了解 MySQL Server 的 binlog 组件的更多相关文章

  1. 【大白话系列】MySQL 学习总结 之 初步了解 MySQL 的架构设计

    一.MySQL还是个黑盒子 我们都知道,只要我们系统引入了 MySQL 驱动和连接池,就能从数据库连接池获取一个数据库连接,然后就可以执行增删改查的操作了. 可是我们并不知道 MySQL 里面是怎么执 ...

  2. MySQL学习之路(一)——初涉MySQL。

    MySQL学习之路(一) 1.1MySQL的概述 MySQL由瑞典MySQL AB公司开发,目前属于Oracle公司. MySQL是一个开源的关系型数据库管理系统. MySQL分为社区版和企业版. 1 ...

  3. mysql学习-windows下绿色版mysql安装问题解决办法

    1.下载绿色版mysql 从该地址http://dev.mysql.com/downloads/mysql/ 中选择windows的版本,选择下载. 2.将下载的压缩包解压. 3.将根目录下的my-d ...

  4. mysql学习笔记(七)—— MySQL内连接和外连接

        MySQL内连接(inner join on) MySQL的内连接使用inner join on,它的效果跟使用where是一样的,如果联结的是两个表,那么需要左右的条件或者说字段是需要完全匹 ...

  5. Mysql学习总结(34)——Mysql 彻底解决中文乱码的问题

    mysql 中常常出现对中文支持不友好的情况 常见的错误 "Illegal mix of collations for operation" 下面我们规整一下 mysql 数据库中 ...

  6. MySQL学习(一)——启动和登录MySql遇到的问题及解决

    1.MySQL使用命令行启动时报错“发生系统错误 5”,如下: 原因:未用管理员身份运行cmd程序 解决方案:在开始菜单里找到命令提示符,右击选择以管理员身份运行 2.登录时报错“提示mysql不是内 ...

  7. Mysql学习总结(21)——MySQL数据库常见面试题

    1. 如何使用SELECT语句找到你正在运行的服务器的版本并打印出当前数据库的名称? 答:下面的语句的结果会显示服务器的版本和当前的数据库名称 mysql> SELECT VERSION(), ...

  8. Mysql学习总结(4)——MySql基础知识、存储引擎与常用数据类型

    1.基础知识 1.1.数据库概述 简单地说:数据库(Database或DB)是存储.管理数据的容器: 严格地说:数据库是"按照某种数据结构对数据进行组织.存储和管理的容器". 总结 ...

  9. Mysql学习总结(2)——Mysql超详细Window安装教程

    目录 一.安装包准备 二.开始安装 三.验证安装 四.客户端工具 一.安装包准备 1.下载MySql5.6 http://www.mysql.com/ 下载如下教程,这时要选MySql On Wind ...

随机推荐

  1. Atlas 读写分离

    1.前置条件 需要配置好mysql 主从 主库:192.168.28.137:16205 从库:192.168.28.135:16205 Atlas:192.168.28.139 2.Atlas 部署 ...

  2. vux中x-input在安卓手机输入框的删除按钮(@on-click-clear-icon)点击没反应

    首先看你自己的的版本好,如果在2.6.9以上,我是在git上找到的解决办法,记录一下,希望可以帮到有需要的小伙伴. 在项目中找 node_modules > vux > x-input & ...

  3. C#反射与特性(三):反射类型的成员

    目录 1,获取类型的信息 1.1 类型的基类和接口 1.2 获取属性.字段成员 上一篇文章中,介绍如何获取 Type 类型,Type 类型是反射的基础. 本篇文章中,将使用 Type 去获取成员信息, ...

  4. delphi7 如何描述窗体上的全部控件

    在delphi开发中,经常需要用到窗体中控件的name名来进行对象方法或属性的调用,所以如何对delphi窗体进行简洁,清楚,完整的描述就很重要.最好能不看界面也能进行界面编码,具体如下表所示: xx ...

  5. SpringBoot基础架构篇3(Redis)

    show me the code and talk to me,做的出来更要说的明白 我是布尔bl,你的支持是我分享的动力! 1 引入 数据库达到瓶颈,有什么解决方法. Redis 可以很好解决这个问 ...

  6. 【转】出现“ValueError : numpy.ufunc has the wrong size, try recompiling" 解决方法

    出现这个问题的原因是:numpy版本和scikit-learn版本不搭配. 解决方法: 升级numpy即可: pip install -U numpy

  7. 【Java并发基础】并发编程领域的三个问题:分工、同步和互斥

    前言 可以将Java并发编程抽象为三个核心问题:分工.同步和互斥. 这三个问题的产生源自对性能的需求.最初时,为提高计算机的效率,当IO在等待时不让CPU空闲,于是就出现了分时操作系统也就出现了并发. ...

  8. webpack 三

    之前06年写了两篇自己研究webpack的文章,由于webpack已经升到了4.x,今天用起来发现有点小变化,重新自己建一个简单的项目,这里记录一下过程 1.安装webpack和webpack-cli ...

  9. Vue中echarts的基本用法

    前言:同大多数的前端框架一样,先读官网的使用方法.学会基本使用后,在实例中找到自己想要demo.拿过来改一改,一个echarts图表就形成,毕竟人家做就是为了方便使用. 我是在vue中下面直接使用的e ...

  10. 小程序的<label>标签

    用来改进表单组件的可用性. 使用for属性找到对应的id,或者将控件放在该标签下,当点击时,就会触发对应的控件. for优先级高于内部控件,内部有多个控件的时候默认触发第一个控件. 目前可以绑定的控件 ...