【大白话系列】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 ...
随机推荐
- [gitHub实践] 实践记录
[gitHub实践] 实践记录 版权2019.4.19更新 Q1:本地仓库和远程仓库连接提示输入用户名密码 本地仓库和远程仓库连接有两种方式 本地初始化建立一个仓库,远程也建立了一个仓库 本地建立仓库 ...
- 1092 最好吃的月饼 (20分)C语言
月饼是久负盛名的中国传统糕点之一,自唐朝以来,已经发展出几百品种. 若想评比出一种"最好吃"的月饼,那势必在吃货界引发一场腥风血雨-- 在这里我们用数字说话,给出全国各地各种月饼的 ...
- MacBook Pro 入手一年了,到底香不香?
最近又有小伙伴问到底值不值得入手一台 MacBook Pro,松哥自己在 2018 年 10 月份的时候入手了一台,到现在为止,也用了一年多了,今天就来和小伙伴们聊一聊使用感受,至于到底值不值,需要大 ...
- Arrays.asList() 导致的java.lang.UnsupportedOperationException异常
Arrays.asList() 只支持遍历和取值 不支持增删改 继承至AbstractList内部类
- Linux查看端口监听占用
# 查看所有 netstat -ntlp # 过滤PORT8080 netstat -ntlp | grep 8080 -t # 仅显示tcp相关选项 -u # 仅显示udp相关选项 -n # 拒绝显 ...
- java main 方法
public static void main(String[] args) { BigDecimal b1 = new BigDecimal(0.01000000); BigDecimal b2 = ...
- angularjs路由菜单强制刷新
在开发过程中遇到使用路由控制单页加载页面时,点击菜单页面不重新刷新的情况,angularjs认为路由没有变化,而不会去刷新页面,解决办法: angular.module('myApp').direct ...
- 元素定位工具Weditor的使用
(1).安装:pip install --pre --upgrade weditor 安装成功 (2).启动python -m weditor
- vue-cookies
vue-cookies用于登录,一般和vuex一起使用 vuex在各个组件共享值,cookie恒久保留值 一.安装 npm install vue-cookies --save 二.引用(在store ...
- C#中TripleDES对应Java中的DESede即大家说的3DES,附C#及Java加解密结果一致的控制台程序例子
直接上代码了. Java控制台代码: package Test; import java.security.Key; import javax.crypto.Cipher; import javax. ...