Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >深入学习MySQL 02 日志系统:bin log,redo log,undo log

深入学习MySQL 02 日志系统:bin log,redo log,undo log

作者头像
KEN DO EVERTHING
发布于 2019-05-13 06:29:42
发布于 2019-05-13 06:29:42
1.9K00
代码可运行
举报
文章被收录于专栏:KEN DO EVERTHINGKEN DO EVERTHING
运行总次数:0
代码可运行

上一篇文章中,我们了解了一条查询语句的执行过程,按理说这篇应该讲一条更新语句的执行过程,但这个过程比较复杂,涉及到了好几个日志与事物,所以先梳理一下3个重要的日志,bin log(归档日志)、redo log(重做日志)、undo log(回滚日志)

概括

MySQL中有六种日志文件,分别是:重做日志(redo log)、回滚日志(undo log)、二进制日志(bin log)、错误日志(error log)、慢查询日志(slow query log)、一般查询日志(general log),中继日志(relay log)。 其中bin log和undo log与事务操作息息相关,bin log也与事务操作有一定的关系,这三种日志,对理解MySQL中的事务操作有着重要的意义。

接下来,分别对3种日志做总结概括

bin log

是个啥

由Mysql的Server层实现,是逻辑日志,记录的是sql语句的原始逻辑,比如"给 ID=2 这一行的C字段加1"

怎么工作的

binlog会写入指定大小的物理文件中,是追加写入的,当前文件写满则会创建新的文件写入。 产生:事务提交的时候,一次性将事务中的sql语句,按照一定的格式记录到binlog中。 清理:可设置参数expire_logs_days,在生成时间超过配置的天数之后,会被自动删除。

有啥用

1.用于复制,在主从复制中,从库利用主库上的binlog进行重播(执行日志中记录的修改逻辑),实现主从同步。 2.用于数据库的基于时间点的还原。

3种记录模式
  • statement:基于SQL语句的模式,某些语句中含有一些函数,例如 UUID,NOW 等在复制过程可能导致数据不一致甚至出错。
  • row:基于行的模式,记录的是行的变化,很安全。但是 binlog 的磁盘占用会比其他两种模式大很多,在一些大表中清除大量数据时在 binlog 中会生成很多条语句,可能导致从库延迟变大。
  • mixed:混合模式,根据语句来选用是 statement 还是 row 模式。表结构变更使用 statement 模式来记录,如果 SQL 语句是 update 或者 delete 语句,那么使用row模式。

redo log

是个啥

由引擎层的InnoDB引擎实现,是物理日志,记录的是物理数据页修改的信息,比如"某个数据页上内容发生了哪些改动"

怎么工作的

原理:当一条数据需要更新时,InnoDB会先将更新操作记录到rodolog中,并更新到内存中,这个更新就算是完成了。InnoDB引擎会在mysql空闲时将这些更新操作更新到磁盘中(数据文件)。 (这个就是MySql经常说到的WAL技术,Write-Ahead Logging ,关键点是先写日志,再写磁盘)

存储:redolog是顺序写入指定大小的物理文件中的。是循环写入的,当文件快写满时,会边擦除边刷磁盘,即擦除日志记录(redolog file)并将数据刷到磁盘中。

有啥用

1.提供crash-safe 能力(崩溃恢复),确保事务的持久性。 数据库突然崩溃,有些数据并未刷到数据文件中,当重启MySQL数据库,会从redolog中未刷到磁盘的数据刷到磁盘中。

2.利用WAL技术推迟物理数据页的刷新,从而提升数据库吞吐,有效降低了访问时延。

undo log

是个啥

由引擎层的InnoDB引擎实现,是逻辑日志,记录数据修改被修改前的值,比如"把Name='B' 修改为Name = 'B2' ,那么undo日志就会用来存放Name='B'的记录"

怎么工作的

当一条数据需要更新前,会先把修改前的记录存储在undolog中,如果这个修改出现异常,,则会使用undo日志来实现回滚操作,保证事务的一致性。

当事务提交之后,undo log并不能立马被删除,而是会被放到待清理链表中,待判断没有事物用到该版本的信息时才可以清理相应undolog。

有啥用

保存了事务发生之前的数据的一个版本,用于回滚,同时可以提供多版本并发控制下的读(MVCC),也即非锁定读

3种日志在事物执行过程中的工作

分别总结很难看出在sql执行过程中这3个日志是如何工作的,现在我们把它们都放到一个事务中。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
user表
id name
1  ken
2  river

执行一个事务
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
BEGIN 
update name = 'wk' from user where id = 1
update name = 'river' from user where id = 2
commit

实际事物的执行顺序如下: A.将id=1的行name的值读取到内存中 B.记录id=1的行name=ken到undo log C.修改name=wk D.记录相应数据页的修改到redo log,并更新内存中的数据 E.将id=2的行name的值读取到内存中 F.记录id=2的行name=lj到undo log G.修改name=lj H.记录相应数据页的修改到redo log,并更新内存中的数据 I.记录事务中所有SQL的逻辑操作到bin log J.提交事务 K.MySql服务器空闲时,把redo log中的物理数据页刷到磁盘数据文件中

1.保证原子性:更新数据前,记录undo log,为保证在更新数据时发生异常导致更新失败,这时可以使用undo log对数据进行回滚(回滚内存中的数据,并会在redo log中记录回滚操作)

2.保证持久性:每更新数据后,记录redo log,为防止服务器突然宕机,导致没有把数据刷到磁盘中,每次重启MySql服务器都会从redo log将脏页(未能及时写到磁盘的数据页)刷到磁盘

3.两阶段提交,保证数据的一致性: 先写redo log,再写bin log,完成后才能认为事务是完整的。从库主要通过bin log进行同步,但如果服务器异常宕机,可能会造成主从数据不一致的情况。

a.写完redo log宕机,bin log还没写 因为两阶段提交机制,MySql会判断redo log 和 bin log是否都完整,如果不完整,则认为事务未提交,在从redo log 刷数据时,就不会刷未提交的事务的数据

b.在写bin log的中途宕机 已经写了部分的bin log,但是没有写完整(binlog 是否完整会有一个标识符标识),仍然认为事务未提交。崩溃恢复和主从复制时,都不会使用未提交的数据,从而实现数据的一致性。

c.bin log写完了,但未提交事务 两阶段提交机制认为,只要redo log和bin log都是完整的,则可以认为事务提交了。

总结

本篇文章只是简单的介绍bin log、redo log、undo log,更深层次的东西就不说了,我也不懂。希望这篇文章能帮到你理解MySql背后的事务。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-04-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 java从心 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
记录一次面试被问到的MySQL三大日志之Undo Log、Redo Log与Bin Log
MySQL数据库作为目前最流行的关系型数据库管理系统之一,开发者在面试中经常会被问到这个问题。其中,Undo Log、Redo Log和Bin Log是MySQL中最重要的三种日志,它们各自承担着不同的职责(各司其职),共同保障数据库的数据一致性、持久性和可恢复性。
祁画
2024/07/26
1540
记录一次面试被问到的MySQL三大日志之Undo Log、Redo Log与Bin Log
MySQL进阶突击系列(02)一条更新SQL执行过程 | 讲透undoLog、redoLog、binLog日志三宝
开篇,先推荐一篇文章《Spring中Bean的作用域深入剖析与技术实践》,作者是【小马哥学JAVA】。
拉丁解牛说技术
2024/12/06
4040
【图文详解】MySQL系列之redo log、undo log和binlog详解
这篇文章主要介绍了MySQL系列之redo log、undo log和binlog详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下。
一个会写诗的程序员
2021/03/15
17.9K1
Mysql日志redo log、undo log、bin log
Mysql中日志文件是非常重要的,也是面试的高频问题。Mysql中日志分为三种,分别是redo log、undo log和bin log,他们在事务回滚,崩溃恢复,主从复制等功能上都是极其重要的,可以说是后端程序员必须掌握的知识点,只是了解Mysql日志,才是真正了解Mysql,下面我们就来看下他们三种日志分别都有什么作用。
一杯茶Ja
2024/10/02
1860
MySQL 日志:undo log、redo log、binlog
今天来和大家分享MySQL的三个日志文件,可以说 MySQL 的多数特性都是围绕日志文件实现,而其中最重要的有以下三种:
田维常
2022/11/25
2.4K0
MySQL 日志:undo log、redo log、binlog
MySQL日志详解——日志分类、二进制日志bin log、回滚日志undo log、重做日志redo log
MySQL作为最流行的开源数据库,其重要性不言而喻。日志是mysql数据库的重要组成部分,记录着数据库运行期间各种状态信息。常见的日志有以下几种:
寻求出路的程序媛
2025/02/06
9820
MySQL日志详解——日志分类、二进制日志bin log、回滚日志undo log、重做日志redo log
MySQL三大日志——binlog、redoLog、undoLog详解
日志是mysql数据库的重要组成部分,记录着数据库运行期间各种状态信息,能帮助我们进行很多容错及分析工作,其中有三大日志与我们这些开发者息息相关,本文将介绍binlog、redoLog、undoLog三种日志:
向着百万年薪努力的小赵
2022/12/02
6K0
MySQL三大日志——binlog、redoLog、undoLog详解
Mysql各种日志binlog、redolog、undolog——Mysql系列(二)
https://segmentfault.com/a/1190000041758784
翰墨飘香
2023/06/11
4.6K0
MySQL的事务实现原理介绍:undo log、redo log、checkpoint和LSN
参考博客1(建议先通读该博客)介绍了MySQL通过Undo+Redo Log的机制实现了事务的原子性、一致性和持久性(关于事务的隔离性是通过锁机制来保障的,请参考我的另一篇博文MySQL常见的七种锁详细介绍)。文章中提到:
saintyyu
2021/11/22
1K0
必须了解的mysql三大日志-binlog、redo log和undo log
来自:https://juejin.im/post/6860252224930070536
用户6543014
2020/09/10
1.8K0
必须了解的mysql三大日志-binlog、redo log和undo log
谈谈Redo Log和Undo Log
在MYSQL中,日志是非常重要的,其中Redo log 和undo log都是引擎层(innodb)实现的日志,redo log 是重做日志,提供 前滚 操作,undo log 是回退日志,提供 回滚 操作。
一个风轻云淡
2023/12/11
6910
mysql日志:redo log、binlog、undo log 区别与作用
概念:重做日志用来实现事务持久性,主要有两部分文件组成,重做日志缓冲(redo log buffer)以及重做日志文件(redo log),前者是在内存中,后者是在磁盘中。
CodingCode
2021/10/13
10.4K1
mysql日志:redo log、binlog、undo log 区别与作用
MySQL中的Redo Log、Undo Log和Binlog:深入解析
在数据库管理系统中,日志是保障数据一致性和完整性的关键机制。MySQL作为一种广泛使用的关系型数据库管理系统,提供了多种日志类型来满足不同的需求。本文将详细介绍MySQL中的Redo Log、Undo Log和Binlog,从背景、业务场景、功能、底层实现原理、使用措施等方面进行详细分析,并通过Java代码示例展示如何与这些日志进行交互。
小马哥学JAVA
2024/10/27
1730
Mysql-4-redo、undo、binlog
Get
2024/03/10
1390
mysql之日志
一条数据在更新过程当中,如果中途 mysql crash 了,mysql 是如何保证数据的一致性和持久性的?在这个过程中 mysql 的日志系统起到了至关重要的作用。本文将会介绍 mysql 中的 undo log、redo log 和 bin log 在这其中的作用。
编程黑洞
2023/03/04
3620
mysql之日志
MySQL日志系统深入解析:Redo Log, Undo Log与Binlog
今天给大家分享MySQL中的三种核心日志——Redo Log、Undo Log和Binlog,涵盖它们的介绍、作用、存储位置、写入机制、记录格式、特点以及如何管理这些日志。
小明互联网技术分享社区
2024/06/21
1.6K0
MySQL日志系统深入解析:Redo Log, Undo Log与Binlog
MySQL七:一文详解六大日志
「mysql数据库中日志是重要组成部分,记录着数据库运行期间各种状态信息」。主要有6类:
云扬四海
2022/09/26
1.4K0
mysql三大日志-binlog、redo log和undo log
日志是mysql数据库的重要组成部分,记录着数据库运行期间各种状态信息。mysql日志主要包括错误日志、查询日志、慢查询日志、事务日志、二进制日志几大类。作为开发,我们重点需要关注的是二进制日志(binlog)和事务日志(包括redo log和undo log),本文接下来会详细介绍这三种日志。
AlbertZhang
2020/08/14
2.5K0
Mysql底层原理超详细,一文速通
里面的三个核心组件, 解析器, 优化器, 执行器,负责完成服务层的核心功能, 其中三个核心组件的交互流程大致如下, 解析器将sql语句转换为解析树, 优化器选择最优的执行方案, 执行器根据计划调用存储引擎执行对应操作并返回结果, 有点类似于公司老总负责将公司战略拆分为一个个小目标分发给公司高管, 然后公司高管决策, 已最高效率达到目的,之后再将任务拆分,给我们打工人, 之后打工人来负责执行
天下之猴
2024/10/01
5741
Mysql底层原理超详细,一文速通
详细分析 MySQL 事务日志(redo log 和 undo log)
InnoDB 事务日志包括redo log和undo log,其中redo log是重做日志,提供前滚操作;undo log是回滚日志,提供回滚操作。undo log不是redo log的逆向过程,其实它们都算是用来恢复的日志:
CG国斌
2020/05/26
1.9K0
推荐阅读
相关推荐
记录一次面试被问到的MySQL三大日志之Undo Log、Redo Log与Bin Log
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验