【大白话系列】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 ...
随机推荐
- selenium模块的基本使用
一.selenium库与requests库的区别 - selenium请求库: - 本质上是一个自动化测试模块; ---> 主要用于测试 UI界面 - selenium除了可以做自动化测试,还可 ...
- Java:Excel文件上传至后台
之前的项目中有遇到上传Excel文件的需求,简单说就是解析一个固定格式的Excel表格,然后存到数据库对应的表中,表格如下: 项目采用SSM架构,mvc模式,显而易见,这个Excel表需要拆成两个表, ...
- Ceph14.2.5 RBD块存储的实战配置和详细介绍,不看后悔! -- <3>
Ceph RBD介绍与使用 RBD介绍 RBD即RADOS Block Device的简称,RBD块存储是最稳定且最常用的存储类型.RBD块设备类似磁盘可以被挂载. RBD块设备具有快照.多副本.克隆 ...
- Git 合并多次提交
在合并分支的时候,希望将多次提交合并成一个,然后再 cherry-pick 到主分支. 合并分支 develop 分支做开发,可能会进行多次提交,但是在发布或者进行 PR 的时候,我们只希望看到一次提 ...
- 【Java基础总结】字符串
1. java内存区域(堆区.栈区.常量池) 2. String length() //长度 //获取子串位置 indexOf(subStr) lastIndexOf(subStr) //获取子串 c ...
- Netty快速入门(06)Netty介绍
前面简单的介绍了Java I/O 和NIO,写了示例程序. Java I/O是阻塞的,为了让它支持多个并发,就要针对每个链接启动线程,这种方式的结果就是在海量链接的情况下,会创建海量的线程,就算用线程 ...
- Java类成员之方法
方法含义: 1. 方法是类或对象行为特征的抽象,用来完成某个功能操作. 2.在某些语言中也称为函数或过程. 3.将功能封装为方法的目的是简化代码,可以实现代码重用. 4.在Java里的方法不能独立存在 ...
- cogs 1176. [郑州101中学] 月考 Map做法
1176. [郑州101中学] 月考 ★★☆ 输入文件:mtest.in 输出文件:mtest.out 简单对比时间限制:1 s 内存限制:128 MB [题目描述] 在上次的月考中B ...
- 【LC_Lesson4】---罗马数字到整数得转换
罗马数字包含以下七种字符: I, V, X, L,C,D 和 M. 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000例如, 罗马数字 2 写做 II ,即为两个并列 ...
- 【ARM】---STM32位带操作总结---浅显易懂
正在准备做毕业设计,配置LED_Config()的时候,又看到了位带操作的宏定义,我又嘀咕了,什么是位带操作,一年前在使用位带操作的时候,就查阅过好多资料,Core-M3也看过,但是对于博主这种“低能 ...