MYSQL中的redolog、undolog、binlog的区别

日志类型与不同引擎的关系核心作用生命周期日志类型
undo log属于innodb引擎独有回滚,保证事务的“原子性”,事务日志事务开始前,以类似“快照”的方式记录现场逻辑日志
redo log属于innodb引擎独有重做,保证事务的“持久性”,事务日志事务开始后记录,prepare阶段落盘物理日志
binlog工作在mysql的Server层,与使用哪种引擎无关实现主从节点数据的复制事务执行期间记录,commit阶段完成前落盘逻辑日志

undo log】(回滚日志)

事务开始之前,将当前事务版本生成 undo log(Tips:undo log 也会产生 redo log 来保证 undo log 的可靠性)。

事务提交之后,undo log 并不能立马被删除,而是放入待清理的链表,由 purge 线程判断是否有其它事务在使用 undo 段中表的上一个事务之前的版本信息,从而决定是否可以清理 undo log 的日志空间。

数据库事务四大特性中有一个是 原子性 ,具体来说就是 原子性是指对数据库的一系列操作,要么全部成功,要么全部失败,不可能出现部分成功的情况。

实际上, 原子性 底层就是通过undo log实现的。undo log主要记录了数据的逻辑变化,比如一条INSERT语句,对应一条DELETE的undo log,对于每个UPDATE语句,对应一条相反的UPDATE的undo log,这样在发生错误时,就能回滚到事务之前的数据状态。例如,user表中原记录如下:

idname
1xiaoming

执行sql update user set name = ‘xiaohong’ where id = 1; 的时候生成的undo log大概是update user set name = ‘xiaoming’ where id = 1;

同时,undo log也是MVCC(多版本并发控制)实现的关键。

redo log】(重做日志)

mysql是如何保证事务的持久性的呢?最简单的做法是在每次事务提交的时候,将该事务涉及修改的数据页全部刷新到磁盘中。但是这么做会有严重的性能问题,主要体现在两个方面:

因为Innodb是以页为单位进行磁盘交互的,而一个事务很可能只修改一个数据页里面的几个字节,这个时候将完整的数据页刷到磁盘的话,太浪费资源了!
一个事务可能涉及修改多个数据页,并且这些数据页在物理上并不连续,使用随机IO写入性能太差!
因此,mysql设计了redo log机制,并通过WAL(Write-Ahead Logging)技术进行了性能优化。WAL的核心就是先顺序IO写日志磁盘、再随机IO写数据磁盘,节省的是随机写磁盘的 IO 消耗。mysql 每执行一条 DML 语句,先将记录顺序追加写入 redo log buffer并更新内存中的数据,等到有空闲线程、内存不足、Redo Log满时再批量落盘持久化。

binlog

binlog是mysql的逻辑日志并且由Server层进行记录,记录对象为任意数据库引擎的写入性操作(不包括查询)信息,以二进制的形式保存在磁盘中。

在实际应用中,binlog的主要使用场景有两个,分别是 主从复制 和 数据恢复 。

主从复制 :在Master端开启binlog,然后将binlog发送到各个Slave端,Slave端重放binlog从而达到主从数据一致。
数据恢复 :通过使用mysqlbinlog工具来恢复数据。
数据更新过程中,万一更新数据的过程中系统出现故障异常重启了,如何保证事务的持久性、原子性呢?概述如下:

记录此次更新前数据记录的快照现场(即写undo log)
读取此次更新所需要的数据入内存
在内存中更新数据(效率高)
写redo log,并置redo log状态为prepare
写binlog
置redo log状态为commit

binlog主要记录什么?

1.事件信息:每条记录都包含了事件信息,包括事件类型,时间戳,机器ID等;
2.数据库和表信息:记录了操作都涉及的数据库和表名;
3. SQL语句信息:记录了完整的SQL语句;
4. 行数据信息:对于使用行格式的操作,binlog中记录了修改前和修改后的行数据,以及修改的具体位置;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

只会写BUG的码农

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值