【大白话系列】MySQL 学习总结 之 初步了解 MySQL Server 的 binlog 组件
一、上节回顾
上节我们讲到,建议将 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 log
和 binlog
刷入磁盘文件中,保证事务提交后,不存在日志丢失的问题。
那么,这两个日志在事务提交时的原理是怎么样的呢?
①、首先会将 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 log
中 commit
标记来表明 binlog
写入成功了。
那为什么要保证 binlog 成功写入磁盘呢?
因为需要保证数据的一致性。
我们假设没有 commit
标记:
提交事务时,redo log
写入成功,而 binlog
写入失败,但是 InnoDB 存储引擎并不知道 binlog
是否写入成功,然后返回成功。当利用 binlog
来做数据归档时,例如 MySQL 的主从复制就是利用 binlog
来做的,那此时会因为 binlog
日志的缺失,而导致主从的数据不一致。
但是如果加入 commit
标记了,只有当 redo log
中有 commit
标记才算事务提交成功,这样就能保证两个日志文件的一致性了。
【大白话系列】MySQL 学习总结 之 初步了解 MySQL Server 的 binlog 组件的更多相关文章
- 【大白话系列】MySQL 学习总结 之 初步了解 MySQL 的架构设计
一.MySQL还是个黑盒子 我们都知道,只要我们系统引入了 MySQL 驱动和连接池,就能从数据库连接池获取一个数据库连接,然后就可以执行增删改查的操作了. 可是我们并不知道 MySQL 里面是怎么执 ...
- MySQL学习之路(一)——初涉MySQL。
MySQL学习之路(一) 1.1MySQL的概述 MySQL由瑞典MySQL AB公司开发,目前属于Oracle公司. MySQL是一个开源的关系型数据库管理系统. MySQL分为社区版和企业版. 1 ...
- mysql学习-windows下绿色版mysql安装问题解决办法
1.下载绿色版mysql 从该地址http://dev.mysql.com/downloads/mysql/ 中选择windows的版本,选择下载. 2.将下载的压缩包解压. 3.将根目录下的my-d ...
- mysql学习笔记(七)—— MySQL内连接和外连接
MySQL内连接(inner join on) MySQL的内连接使用inner join on,它的效果跟使用where是一样的,如果联结的是两个表,那么需要左右的条件或者说字段是需要完全匹 ...
- Mysql学习总结(34)——Mysql 彻底解决中文乱码的问题
mysql 中常常出现对中文支持不友好的情况 常见的错误 "Illegal mix of collations for operation" 下面我们规整一下 mysql 数据库中 ...
- MySQL学习(一)——启动和登录MySql遇到的问题及解决
1.MySQL使用命令行启动时报错“发生系统错误 5”,如下: 原因:未用管理员身份运行cmd程序 解决方案:在开始菜单里找到命令提示符,右击选择以管理员身份运行 2.登录时报错“提示mysql不是内 ...
- Mysql学习总结(21)——MySQL数据库常见面试题
1. 如何使用SELECT语句找到你正在运行的服务器的版本并打印出当前数据库的名称? 答:下面的语句的结果会显示服务器的版本和当前的数据库名称 mysql> SELECT VERSION(), ...
- Mysql学习总结(4)——MySql基础知识、存储引擎与常用数据类型
1.基础知识 1.1.数据库概述 简单地说:数据库(Database或DB)是存储.管理数据的容器: 严格地说:数据库是"按照某种数据结构对数据进行组织.存储和管理的容器". 总结 ...
- Mysql学习总结(2)——Mysql超详细Window安装教程
目录 一.安装包准备 二.开始安装 三.验证安装 四.客户端工具 一.安装包准备 1.下载MySql5.6 http://www.mysql.com/ 下载如下教程,这时要选MySql On Wind ...
随机推荐
- Atlas 读写分离
1.前置条件 需要配置好mysql 主从 主库:192.168.28.137:16205 从库:192.168.28.135:16205 Atlas:192.168.28.139 2.Atlas 部署 ...
- vux中x-input在安卓手机输入框的删除按钮(@on-click-clear-icon)点击没反应
首先看你自己的的版本好,如果在2.6.9以上,我是在git上找到的解决办法,记录一下,希望可以帮到有需要的小伙伴. 在项目中找 node_modules > vux > x-input & ...
- C#反射与特性(三):反射类型的成员
目录 1,获取类型的信息 1.1 类型的基类和接口 1.2 获取属性.字段成员 上一篇文章中,介绍如何获取 Type 类型,Type 类型是反射的基础. 本篇文章中,将使用 Type 去获取成员信息, ...
- delphi7 如何描述窗体上的全部控件
在delphi开发中,经常需要用到窗体中控件的name名来进行对象方法或属性的调用,所以如何对delphi窗体进行简洁,清楚,完整的描述就很重要.最好能不看界面也能进行界面编码,具体如下表所示: xx ...
- SpringBoot基础架构篇3(Redis)
show me the code and talk to me,做的出来更要说的明白 我是布尔bl,你的支持是我分享的动力! 1 引入 数据库达到瓶颈,有什么解决方法. Redis 可以很好解决这个问 ...
- 【转】出现“ValueError : numpy.ufunc has the wrong size, try recompiling" 解决方法
出现这个问题的原因是:numpy版本和scikit-learn版本不搭配. 解决方法: 升级numpy即可: pip install -U numpy
- 【Java并发基础】并发编程领域的三个问题:分工、同步和互斥
前言 可以将Java并发编程抽象为三个核心问题:分工.同步和互斥. 这三个问题的产生源自对性能的需求.最初时,为提高计算机的效率,当IO在等待时不让CPU空闲,于是就出现了分时操作系统也就出现了并发. ...
- webpack 三
之前06年写了两篇自己研究webpack的文章,由于webpack已经升到了4.x,今天用起来发现有点小变化,重新自己建一个简单的项目,这里记录一下过程 1.安装webpack和webpack-cli ...
- Vue中echarts的基本用法
前言:同大多数的前端框架一样,先读官网的使用方法.学会基本使用后,在实例中找到自己想要demo.拿过来改一改,一个echarts图表就形成,毕竟人家做就是为了方便使用. 我是在vue中下面直接使用的e ...
- 小程序的<label>标签
用来改进表单组件的可用性. 使用for属性找到对应的id,或者将控件放在该标签下,当点击时,就会触发对应的控件. for优先级高于内部控件,内部有多个控件的时候默认触发第一个控件. 目前可以绑定的控件 ...