mysql日志之redolog和binlog(代码片段)

god-jiang god-jiang     2023-03-24     525

关键词:

前言

只要是接触过MySQL的程序员,那么或多或少都有听过redo log(重做日志)和binlog(归档日志)。今天就来分享一下这两个日志的用处和区别。

简单来说,redo log是InnoDB特有的日志,如果使用的是其他存储引擎,就没有redo log,只有binlog。

binlog是MySQL的Server层的日志,不管使用什么存储引擎,都会有binlog的存在。那么,为什么要有redo log和binlog呢?一个binlog不就可以全部解决了吗?接下来我们就来详细看一下redo log和binlog的区别吧。

redo log

redo log称为重做日志,用于记录事务的变化,记录的是数据被修改之后的值。InnoDB采用redo log来保证事务更新的一致性和持久性。

在MySQL中,如果你要更新一条语句,需要带更新条件,比如update T set name = ‘god-jiang’ where id=6,一般都是先查询到id=6的语句,然后再进行更新操作。

如果更新的数量是100条,1000条甚至10000条的时候,每一次更新都需要写到磁盘上。然后磁盘也要找到对应的记录,然后再更新,整个过程IO成本、查找成本太大,为了解决这个问题,MySQL的设计者采用了WAL技术来解决。WAL全称是Write Ahead Logging,意思就是先写日志,再写磁盘

具体操作:当有一条记录需要更新的时候,InnoDB引擎会先把记录写到redo log中,并更新内存,这个时候更新就算完成了。同时,InnoDB引擎会在适当的时候(系统空闲时),将这个操作记录更新到磁盘中,这个更新往往是在系统比较空闲的时候。

但是redo log的大小是固定的,不可能一直无限写,让我们看下MySQL怎么做到的吧。

MySQL使用的是write pos和check point搭配循环写保证数据都能及时的更新到磁盘中。

write pos是当前记录的位置,一边写一边往后移动。check point是当前要擦除的位置,也是往后移动并且循环的,擦除记录之前要把记录更新到数据文件中。

ib_logfile_3写满了之后就会回到ib_logfile_0继续写。而ib_logfile_x都是可以通过MySQL来配置分组,但是配置的redo log大小是固定的。

write pos与check point之间的部分表示可以记录新的操作。如果write pos追上了check point,表示redo log满了,这个时候就不能继续执行新的操作,需要停下擦除一些记录,并且把check point往后推进。

有了redo log,InnoDB可以保证即使数据库发现异常重启了,也不会丢失之前提交的事务,这个能力也被称为crash-safe

以上就是redo log的介绍,看完了之后,你可以试着去问一下你公司的DBA同事,MySQL是否可以恢复到半个月内任意一秒的状态,得到的答案肯定是可以的,这都要归功于redo log的功劳。

binlog

binlog记录了所有DDL(数据定义语句)和DML(数据操纵语句),但是不包括select和show。

binlog主要用来进行POINT-IN-TIME(PIT)的恢复及主从复制环境的建立。从表面上看它和redo log非常相似,都是记录了对于数据库操作的日志,但是从本质上看,还是有着非常大的不同。

redo log和binlog的区别

  • 首先,redo log是在InnoDB存储引擎层产生,而binlog是在数据库上层产生的,并且binlog不仅仅针对InnoDB存储引擎,MySQL数据库中任何存储引擎都会产生binlog
  • 其次,两种日志的内容记录不同。binlog是一种逻辑日志,其记录的是对应的SQL语句,而redo log是一种物理日志,其对应的是对于每个页的修改
  • 最后,两种日志写入磁盘的时间点不同,binlog只在事务提交完成后进行一次写入,而redo log在事务进行中不断的写入,表现为不是随事务提交的顺序写入
  • binlog一般作为恢复数据使用,主从复制搭建,而redo log通常作为MySQL异常宕机或者介质故障后的数据恢复使用

通过简单的更新语句演示执行器和InnoDB引擎的内部流程

update T set name = 'god-jiang' where id = 6
  1. 通过执行器从InnoDB引擎取出id=6的记录,然后加载到内存中
  2. 执行器拿到引擎返回的结果,把name修改为’god-jiang’,再重新调用存储引擎的接口写入新数据
  3. 引擎将新数据更新到内存中,同时将这个更新操作写到redo log中,此时redo log处于prepare状态
  4. 执行器生成这个操作的binlog,并把binlog写到磁盘中
  5. 执行器调用引擎提交事务的接口,并且把刚刚写入的redo log改为commit状态,更新完成

对应的流程图

最后为什么写入redo log会处于prepare状态,然后写入binlog还要变成commit状态?其实这个过程就叫做“两阶段提交”。

两阶段提交

其实redo log和binlog都可以用于表示事务的提交的状态,而两阶段提交就是让这两个状态保持逻辑上的一致。

举例子:update T set name = ‘god-jiang’ where id = 6没有两阶段提交会发生什么?

先写redo log后写binlog。假设写完了redo log,binlog还没有写完,这个时候MySQL异常重启。因为redo log写完了,恢复系统的时候name=‘god-jiang’。但是binlog没有写完,所以binlog没有记录这条语句,这个时候用binlog恢复数据的时候,恢复出来的name就是原来值,与redo log不同。

同理可得,先写binlog后写redo log也会发现两个日志恢复的数据不同。这个不一致会导致线上出现主从不一致的情况。

总结

  • redo log可以保存crash-safe能力,可以保证MySQL异常重启数据不丢失
  • binlog可以记录对应的SQL语句,也可以保证MySQL异常重启数据不丢失
  • 提交事务的两阶段提交,可以维持数据逻辑一致性

参考资料

  • 《MySQL实战45讲》 林晓斌
  • 《高性能MySQL》第三版 1.3 事务
  • 《MySQL技术内幕》第二版 7.2事务的实现

mysql中的日志“binlog”的三种格式(代码片段)

MySQL中的日志比较重要的有binlog(归档日志)、redolog(重做日志)以及undolog;1.binlogbinlog我们中文一般称作归档日志,当我们搭建MySQL主从的时候就离不开binlog;binlog是MySQLServer层的日志,而不是存储引擎自带的日志,它记录了... 查看详情

大白话系列mysql学习总结之初步了解mysqlserver的binlog组件(代码片段)

一、上节回顾上节我们讲到,建议将redolog的刷盘策略设置为1:即提交事务时,强制将redologbuffer里的redolog刷入到磁盘后才算事务提交成功。但是我们都知道,redologbuffer是InnoDB存储引擎的组件,而MySQL支持很多种存储引擎,那么My... 查看详情

刨析mysql三大日志:binlogredolog和undolog

目录刨析MySQL三大日志:binlog、redolog和undologbinlogbinlog使用场景binlog刷盘时机binlog日志格式redolog为什么需要redologredolog基本概念redolog记录形式redolog与binlog区别undolog刨析MySQL三大日志:binlog、redolog和undolog日志是MySQL数据库... 查看详情

day887.mysql写入binlog和redolog的流程机制-mysql实战(代码片段)

MySQL写入binlog和redolog的流程机制Hi,我是阿昌,今天学习记录的是关于MySQL写入binlog和redolog的流程机制的内容。只要redolog和binlog保证持久化到磁盘,就能确保MySQL异常重启后,数据可以恢复。那redolog的写入流程是... 查看详情

mysql的binlog与主从复制

...以使用多种存储引擎。其中最常用的InnoDB引擎支持事务,RedoLog和UndoLog就是InnoDB里面的工具,用于实现事务。而Binlog是MySQL层面的东西,用于实现主从复制,与使用的存储引擎无关。通过监听并解析Mater的Binlog,也可以实现将MySQL... 查看详情

mysql性能优化innodb之日志文件(代码片段)

...分析1.4.3.1.sync_binlog=01.4.3.2.sync_binlog=11.5.基于binlog和redolog的commit标记1.6.IO线程将内存更新后的脏数据刷回磁盘1.MySQL日志记录文件1.1.回顾SQL语句的执行在上一篇文章我中,我们着重的介绍了SQL语句执行的一个过程。MySQL... 查看详情

mysql中redolog和binlog的总结(代码片段)

一.redolog1.redolog的概念redolog是物理日志,默认大小是4G,记录在某个数据页上做了什么修改。有了redolog,InnoDB就可以保证即使数据库发生异常重启,之前提交的记录都不会丢失,这个能力称为crash-safe。因为redolog的写入... 查看详情

mysql三大日志——binlogredologundolog详解(代码片段)

目录跳转电梯1.redoLog1.1为什么需要redolog1.2redolog基本概念1.3redolog记录形式2.binlog2.1binlog基本概念2.2binlog使用场景2.3binlog日志格式3.redolog和binlog区别4.undolog日志是mysql数据库的重要组成部分,记录着数据库运行期间各种状态信息... 查看详情

mysql的redologundologbinlog

MySQL的redolog、undolog、binlog一、MySQL日志文件类型二、几种日志的对比2-1、用途2-2、存储内容、格式2-3、日志生成2-4、删除策略2-5、redolog与binlog的区别三、两阶段提交一、MySQL日志文件类型重做日志(redolog)回滚日志(... 查看详情

redolog与binlog间的破事(代码片段)

前言阿星在前面两篇文章都详细聊过redolog与binlog,有兴趣的朋友可以去看看前面两篇文章:聊聊redolog是什么?你必须知道的binlog日志今天就来聊聊InnoDB是如何保证redolog与binlog两份日志之间的逻辑一致。两阶段提交red... 查看详情

redolog与binlog间的破事(代码片段)

前言阿星在前面两篇文章都详细聊过redolog与binlog,有兴趣的朋友可以去看看前面两篇文章:聊聊redolog是什么?你必须知道的binlog日志今天就来聊聊InnoDB是如何保证redolog与binlog两份日志之间的逻辑一致。两阶段提交red... 查看详情

mysqlbinlog和redolog的写入机制(代码片段)

binlog的写入机制每个线程都会先将日志写入到binglogcache,事务提交的时候,再把binlogcache写到binlog文件中。所有线程都写一个binlog日志。binlog_cache_size用于控制单个线程内binlogcache所占内存的大小,如果超过了这个参数规定的大小... 查看详情

再学mysql(代码片段)

...擎就好比OSS,COS,MinIO等,都兼容了AWSS3的API。二、redoLog、binlog与两阶段提交redolog就是WAL(Write-AheadLogging)日志,其实现是通过环形链表(这个实现与redis主从同步的binlog相同,都是用环形链表)ÿ... 查看详情

mysql系列之日志汇总:redologundologbinlogerrorlogslowqueryloggenerallogrelaylog

概述MySQL中至少有7种日志文件:重做日志(redolog)回滚日志(undolog)二进制日志(binlog)错误日志(errorlog)慢查询日志(slowquerylog)一般查询日志(generallog)中继日志(relaylog)。MySQLServerLog有4种:ErrorLog、GeneralQueryLog、Binary... 查看详情

mysql是怎么保证redolog和binlog是完整的?

摘要:WAL机制保证只要redolog和binlog保证持久化到磁盘,就能确保MySQL异常重启后,数据可以恢复。本文分享自华为云社区《MySQL会丢数据吗?》,作者:JavaEdge。在业务高峰期临时提升性能的方法。WAL机制... 查看详情

redolog与binlog间的破事(代码片段)

前言阿星在前面两篇文章都详细聊过redolog与binlog,有兴趣的朋友可以去看看前面两篇文章:聊聊redolog是什么?你必须知道的binlog日志今天就来聊聊InnoDB是如何保证redolog与binlog两份日志之间的逻辑一致。两阶段提交red... 查看详情

纯手绘图解-mysqlundolog、redolog、binlog

参考技术A这是一条非常简单的SQL语句[updatestudentsetscore=100wherescore=50],从MySQL服务端接收SQL到写入磁盘,经过了Server层和InnoDB存储引擎,中间掺杂着磁盘读取、日志记录、内存更新、写入磁盘。MySQL为什么将Server层和引擎层拆分?... 查看详情

图文结合带你搞懂mysql日志之redolog(重做日志)(代码片段)

...;在MySQL8.0.30Redo发生变化,详情见: MySQL8.0.30动态redolog初探前面聊了MySQL中的UndoLog日志和InnoDB中的MVCC,今天一起来学习下RedoLog日志。事务有4种特性:原子性、一致性、隔离性和持久性(ACID)。那么事务... 查看详情