热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

MySQL日志之redolog和binlog

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

前言

只要是接触过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日志之redo log和binlog》

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状态,更新完成

对应的流程图
《MySQL日志之redo log和binlog》

最后为什么写入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事务的实现

推荐阅读
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 本文详细介绍了MysqlDump和mysqldump进行全库备份的相关知识,包括备份命令的使用方法、my.cnf配置文件的设置、binlog日志的位置指定、增量恢复的方式以及适用于innodb引擎和myisam引擎的备份方法。对于需要进行数据库备份的用户来说,本文提供了一些有价值的参考内容。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 安装mysqlclient失败解决办法
    本文介绍了在MAC系统中,使用django使用mysql数据库报错的解决办法。通过源码安装mysqlclient或将mysql_config添加到系统环境变量中,可以解决安装mysqlclient失败的问题。同时,还介绍了查看mysql安装路径和使配置文件生效的方法。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 本文介绍了PhysioNet网站提供的生理信号处理工具箱WFDB Toolbox for Matlab的安装和使用方法。通过下载并添加到Matlab路径中或直接在Matlab中输入相关内容,即可完成安装。该工具箱提供了一系列函数,可以方便地处理生理信号数据。详细的安装和使用方法可以参考本文内容。 ... [详细]
  • 本文讨论了在数据库打开和关闭状态下,重新命名或移动数据文件和日志文件的情况。针对性能和维护原因,需要将数据库文件移动到不同的磁盘上或重新分配到新的磁盘上的情况,以及在操作系统级别移动或重命名数据文件但未在数据库层进行重命名导致报错的情况。通过三个方面进行讨论。 ... [详细]
  • Linux如何安装Mongodb的详细步骤和注意事项
    本文介绍了Linux如何安装Mongodb的详细步骤和注意事项,同时介绍了Mongodb的特点和优势。Mongodb是一个开源的数据库,适用于各种规模的企业和各类应用程序。它具有灵活的数据模式和高性能的数据读写操作,能够提高企业的敏捷性和可扩展性。文章还提供了Mongodb的下载安装包地址。 ... [详细]
  • mysql-cluster集群sql节点高可用keepalived的故障处理过程
    本文描述了mysql-cluster集群sql节点高可用keepalived的故障处理过程,包括故障发生时间、故障描述、故障分析等内容。根据keepalived的日志分析,发现bogus VRRP packet received on eth0 !!!等错误信息,进而导致vip地址失效,使得mysql-cluster的api无法访问。针对这个问题,本文提供了相应的解决方案。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • r2dbc配置多数据源
    R2dbc配置多数据源问题根据官网配置r2dbc连接mysql多数据源所遇到的问题pom配置可以参考官网,不过我这样配置会报错我并没有这样配置将以下内容添加到pom.xml文件d ... [详细]
author-avatar
余逮月笑下死手
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有