【大白话系列】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 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 标记才算事务提交成功,这样就能保证两个日志文件的一致性了。

原文地址:https://www.cnblogs.com/Howinfun/p/12304030.html

时间: 2024-10-20 14:51:51

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

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

一.MySQL还是个黑盒子 我们都知道,只要我们系统引入了 MySQL 驱动和连接池,就能从数据库连接池获取一个数据库连接,然后就可以执行增删改查的操作了. 可是我们并不知道 MySQL 里面是怎么执行的,例如我们执行了 insert 语句,只知道表里面多了一条数据,MySQL 是怎么插入的我们就不知道了. 二.解开 MySQL 这个黑盒子 1.一条工作线程: 举例: 我们都知道,在 Socket 编程里,ServerSocket 会有一条线程负责监听 Socket 发送过来的网络请求,并且负责

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

    MySQL内连接(inner join on) MySQL的内连接使用inner join on,它的效果跟使用where是一样的,如果联结的是两个表,那么需要左右的条件或者说字段是需要完全匹配的. 来看个例子:有两张表customers客户表和orders订单表,外键是cust_id,我们需要知道哪些客户有订单 select customers.cust_id,orders.order_num from customers , orders where customers.cust_i

MySQL学习2 使用docker建立mysql服务

在centos 7的服务器上运行 yum install docker 安装完docker后,运行 service docker start 启动docker 由于公司的服务器连接dockerhub一直有些问题,估计是gfw导致的,所以只能下载一个国内的镜像 https://hub.tenxcloud.com/ 大家可以到时速云搜索自己需要的image 我选择了star最高的一个mysql的镜像 使用以下命令将mysql的image下载到了本地 docker pull index.tenxclo

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

1.MySQL使用命令行启动时报错"发生系统错误 5",如下: 原因:未用管理员身份运行cmd程序 解决方案:在开始菜单里找到命令提示符,右击选择以管理员身份运行 2.登录时报错"提示mysql不是内部或外部命令,也不是可运行的程序或批处理文件" 解决方案:配置环境变量(右击我的电脑->高级系统设置->环境变量,选择Mysql安装的目录,在Mysql安装的目录中找到bin目录,把此路径复制.选择系统中的path->编辑->把刚复制的路径添加进

MySQL学习笔记之九:MySQL Replication

Mysql内建的复制功能是构建大型.高性能应用程序的基础.复制功能不仅有利于构建高性能的应用,同时也是高可用性.可扩展性.灾难恢复.备份以及数据仓库等工作的基础. 一.复制概述 1.复制的功用 数据分布.负载均衡.备份.高可用性.MySQL升级测试 2.复制的工作原理 ①主库把数据更改记录到二进制日志(binary log)中 ②备库将主库的二进制日志复制到本地的中继日志(relay log)中.首先,备库会启动一个I/O线程,跟主库建立一个普通的客户端连接,然后在主库上启动一个特殊的二进制转储

mysql学习笔记(二)--- MySQL数据类型

[正文] 上一章节中,我们学习了MySQL软件的安装,既然软件都装好了,现在就正式开始MySQL的基础知识的学习吧,即使是零基础,也要一步一个脚印.恩,首先要学习的就是MySQL的数据类型. 一.数据类型: 1.整型(xxxint) 2.浮点型(float和double) 3.定点数(decimal) 4.字符串(char,varchar,xxxtext) 5.二进制数据(xxxBlob) 6.日期时间类型 二.数据类型介绍: 1.整型: 注:M表示最大的显示宽度.其中,int用的最多. 2.浮

MySQL学习笔记(六)—— MySQL自连接

有的时候我们需要对同一表中的数据进行多次检索,这个时候我们可以使用之前学习过的子查询,先查询出需要的数据,再进行一次检索. 例如:一张products表,有产品id,供应商id(vend_id),产品名称等等. mysql> select * from products; +---------+---------+-----------+------------+-----------+ | prod_id | vend_id | prod_name | prod_price | prod_de

MySQL学习9:详解MySQL中的外键约束

本篇主要讲解MySQL中的外键约束. 一约束概述 创建约束的目的就是保证数据的完整性和一致性.约束根据约束针对的字段的数目的多少划分为表级约束和列级 约束. 如果约束按照功能来划分的话刻印划分为:NOT NULL(非空约束).PRIMARY KEY(主键约束).UNIQUE KEY(唯一约束).DEFAULT(默认约束)和FOREIGN KEY(外键约束). 在前面我们已经初步涉及到了除外键约束之外的四个约束,这一次我们来谈谈最复杂的外键约束. 二外键约束的要求 FOREIGN KEY(外键约束

MySQL学习笔记——第2章 MySQL的安装与配置

在Windows下安装MySQL:http://jingyan.baidu.com/article/4b07be3c67853c48b380f311.html 在Linux下安装MySQL:http://blog.itblood.com/under-linux-mysql-latest-version-installation-diagram-tutorial.html