技术分析 | 通过DML语句浅谈binlog和redo log

【MySQL】MySQL 的 redo log 和 binlog 区别 1.概述 2. 为什么需要 redo log? redo log 主要用于 MySQL 异常重启后的一种数据恢复手段,确保了数据的一致性。 其实是为了配合 MySQL 的 WAL 机制。因为 MySQL 进行更新操作,为了能够快速响应,所以采用了异步写回磁盘的技术,写入内存后就返回。但是这样,会存在 crash后 内存数据丢失的隐患,而 redo log 具备 crash safe 的能力。 3.crash-safe 能力 为什么 redo log 具有 crash-safe 的能力,是 binlog . 阅读详情

欢迎来到 GreatSQL社区分享的MySQL技术文章,如有疑问或想学习的内容,可以在下方评论区留言,看到后会进行解答

  • GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源。

1. 导言

我们在采用InnoDB引擎的情况下,编写SQL语句WHERE条件的时候,可以通过AND操作符来提高数据的过滤能力,当然,在使用AND操作符也有许多需要注意的地方,就好比一条更新语句:

mysql>update testtable set price = 52.0,name = 'test_name';

本意是将表内对应字段重置为指定信息,可是现在不小心写成了:

mysql>update testtable set price = 52.0 and name = 'test_name';

这个时候,我们查看表发现:

mysql> select * from testtable;
+----+----------+------------+
| id | name     | price      |
+----+----------+------------+
| 1  | old_name |  0.00      |
| 2  | old_name |  0.00      |
+----+----------+------------+

显然,系统会把AND当做判断条件进行逻辑判断,这里所有列都不满足条件,所以结果为0。此时,我们可以利用事务回滚特性,回滚这个update,而为了更好地理解,我们需要重新来看看这一条update语句

2. binlog和redo log

现有一条SQL语句:

mysql>update testtable set price = price + 1 where id = 5;

我们知道,这条语句在分析器是进行词法和语法解析,并且知道这是一条更新语句。并由优化器决定要使用id这个索引。然后,执行器负责具体执行,找到这一行,然后更新。说到更新流程,说到更新操作,我们不得不提到两个日志模块:binlog和redo log

2.1 binlog

先来说一说binlog,该日志存在于Server层次中,是使用存储引擎都可以使用的日志模块,binlog是逻辑日志,记录的是这个语句的原始逻辑,比如“给id=5这一行的price字段值加1” binlog的日志文件是可以追加写入的。“追加写入”是指binlog日志文件写到一定大小后会切换到下一个文件进行写入,可以设置sync_binlog为1,让每次事务的binlog都持久化保存到磁盘中

2.2 redo log

而重做日志redo log是MySQL中InnoDB引擎才有的日志,它是物理日志,即记录的内容是“在某个数据页上做了什么修改“

MySQL对于每一次的更新操作如果都需要写进磁盘,然后磁盘也要找到对应的那条记录,然后再更新,过程中的IO成本、查找成本都很高。redo log有效的提升了更新效率

redo log是固定大小的,比如可以配置为一组4个文件,每个文件的大小是1GB,那么总共就可以有4GB的空间去记录我们进行的操作。从头开始写,写到末尾就又回到开头循环写,如下图:

file

write pos是当前记录的位置,一边写一边后移,写到第log_3文件末尾后就回到log_0文件开头。checkpoint是当前要释放的位置,也是往后推移并且循环的,释放记录前要把记录更新到数据文件。如果write pos追上checkpoint,那就表明全部空间都满了,这时候不能再执行新的更新,得停下来先释放掉一些位置,让checkpoint继续推进

当有一条记录需要更新的时候,InnoDB引擎就会先将数据更新到内存,再把记录写到redo log里面,这个时候更新就算完成了。同时,InnoDB引擎会在适当的时候,将这个操作记录更新到磁盘里面,而这个更新往往是在系统比较空闲的时候做,可以设置 innodb_flush_log_at_trx_commit为1,表示每次事务的redo log都直接持久化到磁盘中

2.3 binlog和redo log的区别

file

3. InnoDB引擎下模拟执行过程

可参考下图:

file

  • 执行器先通过引擎取到id=5的这一行。id是为该表主键,因此引擎根据BTREE索引查找找到id=5的这一行。如果该行所在的数据页本来就在内存中,就直接返回给执行器;否则,需要先从磁盘读入内存,然后再返回

  • 执行器拿到引擎给的行数据,把price值加上1,得到新的一行数据,再调用引擎接口写入这行新数据

  • 引擎将这行新数据更新到内存中,同时将这个更新操作记录到redo log里面,此时redo log处于prepare状态。然后告知执行器执行完成了,随时可以提交事务。执行器生成这个操作的binlog,并把binlog写入磁盘

  • 执行器调用引擎的提交事务接口,引擎把刚刚写入的redo log改成提交commit状态,更新完成

Enjoy GreatSQL :)

文章推荐:

GreatSQL MGR FAQ https://mp.weixin.qq.com/s/J6wkUpGXw3YkyEUJXiZ9xA

万答#12,MGR整个集群挂掉后,如何才能自动选主,不用手动干预 https://mp.weixin.qq.com/s/07o1poO44zwQIvaJNKEoPA

『2021数据技术嘉年华·ON LINE』:《MySQL高可用架构演进及实践》 https://mp.weixin.qq.com/s/u7k99y6i7riq7ScYs7ySnA

一条sql语句慢在哪之抓包分析 https://mp.weixin.qq.com/s/AYibbzl860D90rOeyjB6IQ

万答#15,都有哪些情况可能导致MGR服务无法启动 https://mp.weixin.qq.com/s/inSGpd0Q_XIl2Mb-VsvNsA

技术分享 | 为什么MGR一致性模式不推荐AFTER https://mp.weixin.qq.com/s/rNeq479RNsklY1BlfKOsYg

关于 GreatSQL

GreatSQL是由万里数据库维护的MySQL分支,专注于提升MGR可靠性及性能,支持InnoDB并行查询特性,是适用于金融级应用的MySQL分支版本。

Gitee: https://gitee.com/GreatSQL/GreatSQL

GitHub: https://github.com/GreatSQL/GreatSQL

Bilibili: https://space.bilibili.com/1363850082/video

微信&QQ群: 可搜索添加GreatSQL社区助手微信好友,发送验证信息“加群”加入GreatSQL/MGR交流微信群

QQ群:533341697 微信小助手:wanlidbc

本文由博客一文多发平台 OpenWrite 发布!

STM32G474实战:数字LLC电源控制程序从零到跑通(附完整代码解析) 本文详细介绍了基于STM32G474微控制器开发数字LLC电源控制程序的完整实战流程。从硬件平台搭建、CubeMX工程配置,到核心控制逻辑、双速率中断框架、数字PID实现,再到Burst模式、状态机等高级策略与异常处理,提供了从零到跑通的系统化指南与代码解析,助力开发者掌握高效数字电源的程序编写与调试技巧。 阅读详情

相关推荐

Multisim14安装失败?手把手教你彻底清理残留文件(附专用卸载工具)

本文针对Multisim14安装失败问题,提供了一套从根源解决的完整方案。文章详细分析了安装失败的三大元凶——文件残留、注册表残留和隐藏组件,并手把手指导用户使用专用卸载工具进行标准化清理,再结合手动深度清理文件系统和注册表,最终实现彻底卸载和完美重装,有效解决Multisim14安装问题。

weixin_29179311的博客 317

mysqlbinlog查看日志_mysql binlog 使用整理

一、binlog简介mysql-binlog是MySQL数据库最重要的二进制日志,它记录了所有的DDL和DML((除了数据查询语句),以事件形式记录,还包含语句所执行消耗的事件。binlog主要应用于主从复制和数据恢复。binlog主从复制主要有三个步骤第一步:master在每次准备提交事务完成数据更新前,将改变记录到二进制日志(binary log)中(这些记录叫做二进制日志事件,binary ...

weixin_39634985的博客 472

Coze离线部署实战:从镜像拉取到服务启动的完整避坑指南

本文提供了一份详尽的Coze平台离线部署实战指南。针对无外网的生产环境,详细讲解了从Docker镜像拉取、打包传输到内网服务器加载的完整流程,并重点剖析了使用docker-compose启动服务时常见的配置错误与权限问题,如文件挂载缺失、网络绑定错误等,提供了经过验证的避坑解决方案,旨在帮助运维和开发人员一次性成功部署。

weixin_29310605的博客 328

Java实现从mysql5.5的binlog日志解析文件中获取mysql的DDL和DML

前言 今天一不小心在正式环境执行了一条delete语句,这尼玛如果不恢复回来是要跑路的进奏了啊,赶紧去看MySQL的binlog日志。当然前提是你的MySQL开启了binlog,如果没有开启的话那下面就不用看了(拜拜了您呢)。 一.开启binlog方法 找到mysql的安装路径下的my.ini,一打开就能看到,不用多说。然后在 [mysqld] 下面添加一段话: #binlog日志文件,以mysql-bin开头,默认在C:\ProgramData\MySQL\MySQL S...

S_First的博客 913

新手避坑指南:HT7036计量芯片SPI读取电压的完整流程(从复位到校准)

本文详细介绍了HT7036计量芯片的SPI读取电压完整流程,从硬件准备到校准设置,重点解析了复位引脚处理、SPI通信配置、芯片初始化及数据处理等关键步骤。针对常见问题如晶振焊接、SPI时序错误等提供实用解决方案,帮助开发者高效完成电压测量与校准。

weixin_30070339的博客 326

直击痛点:VS2015离线安装报错“安装包丢失或损坏”的根源分析与精准修复

本文深入剖析了Visual Studio 2015离线安装时出现“安装包丢失或损坏”报错的根本原因,指出问题核心在于安装程序固化的临时路径查找逻辑。文章提供了一步到位的精准修复方案,通过将ISO镜像中的完整packages文件夹复制到安装程序指定的临时路径,即可无需联网、无需操作证书直接解决问题,并对比分析了其他常见方法的局限性。

weixin_27734811的博客 357

对MySQL binlog日志解析,统计每张表的DML次数

想要获取每天数据库每张表的DML的次数,统计热度表,可以使用该脚本 # coding:utf-8 # 解析binlog,统计热度表,表的DML个数 import sys import os # mysqlbinlog解析binlog日志 def binlog_output(): binlog_file = sys...

weixin_30318645的博客 808

Cadence HDL原理图库避坑指南:从Excel导入引脚到解决‘V- V+’报错(附FPGA实例)

本文详细介绍了Cadence HDL原理图库的高效构建与排错方法,重点讲解如何从Excel智能导入引脚数据并优化FPGA封装设计。通过数据预处理、智能导入和深度排错三个关键阶段,帮助工程师避免常见错误如‘V- V+’报错,提升设计效率和准确性。

weixin_28739079的博客 236

通过DML语句浅谈binlog和redo log

本文首发于GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源1. 导言2. binlog和redo log2.1 binlog2.2 redo log2.3 bin...

老叶茶馆 317

三维(点云)语义分割概述以及方法总结

语义分割 语义分割需要两部分 classification: 需要全局信息 segmentation:更加依赖全局信息和局部信息 一般的网络结构是: 提特征-特征映射-特征图压缩(降维)-全连接-分类,其实就是encoder-decoder的过程, 比如在二维的的pspnet,fcn等等 0. 三维表示的数据结构 Point cloud 无序性 点云实际上是无序的,比如有8个点云,你放到...

renhaofan的博客 3万+

OpenPose 论文理解

OpenPose: Real-time multi-person keypoint detection library for body, face, hands, and foot estimation paper: Realtime Multi-Person 2D Pose Estimation using Part Affinity Fields link: OpenPose paper...

JustForYou的博客 2万+

数据库日志:Redo Log、Undo Log、Binlog 和 Relay Log

MySQL的数据库日志

@初阶牛的博客 1810

YOLOv11改进策略【损失函数篇】| 通过辅助边界框计算IoU提升检测效果(Inner_GIoU、Inner_DIoU、Inner_CIoU、Inner_EIoU、Inner_SIoU)

为了弥补现有 IoU 损失在不同检测任务中泛化性弱和收敛速度慢的问题,·Inner-IoU·通过引入比例因子 “ratio” 来控制辅助边界框的尺度大小,利用不同尺度的辅助边界框来计算损失,从而加速边界框回归过程。

Limiiiing的博客 3892

从一条update语句出发解析 binlog 和 redo log

MySQL通过redo log和binlog两大日志模块协作完成数据更新操作。redo log是InnoDB引擎的物理日志,采用循环写入方式实现高性能的WAL机制;binlog是Server层的逻辑日志,用于主从复制和数据恢复。update语句执行采用两阶段提交(prepare和commit)确保两个日志的一致性,防止数据丢失或不一致。生产环境建议配置"双1模式"(innodb_flush_log_at_trx_commit=1和sync_binlog=1)来保证数据安全。这种设计既保证

记不住所以写下来 1350

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

MySQL中的Redo Log、Undo Log和Binlog:深入解析

Redo Log、Undo Log和Binlog是MySQL中非常重要的日志系统,它们为数据库的事务性、持久性和恢复性提供了关键的支持。理解并合理使用这些日志,可以有效地提升数据库的性能和可靠性。作为资深架构师,在设计和优化数据库系统时,需要充分考虑这些日志的使用和配置,以确保数据的一致性和完整性。

喜欢猪猪 1061

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Mysql之Redo log(Red log of MySQL)

Redo log是MySQL数据库中用于保证事务持久性的重要机制。‌ Redo log,也称为重做日志,主要用于在数据库发生崩溃时恢复未写入磁盘的数据,确保事务的持久性。 Redo log的基本概念和作用 Redo log记录了所有已提交事务的操作,当数据库重启时,系统会重做这些操作以恢复数据。其主要作用包括: 崩溃恢复‌:在数据库崩溃后,通过Redo log恢复尚未写入磁盘的数据‌。 ‌提高性能‌:通过先写Redo log再异步写入磁盘的方式,减少直接写磁盘的次数,提高性能‌。

Linux运维老纪的博客 950

三大日志(undo log,redo log,bin log)和事务的二阶段提交

摘要:MySQL事务处理依赖三大日志协同工作。UndoLog记录修改前的数据快照,用于事务回滚和MVCC;RedoLog记录物理变更,确保事务持久性和崩溃恢复;Binlog记录逻辑操作,用于主从复制和数据恢复。二阶段提交机制保证RedoLog和Binlog的一致性:先Prepare阶段写入RedoLog,再Commit阶段写入Binlog后提交RedoLog。组提交优化通过批量处理事务日志提升性能,将多个事务的日志合并刷盘。三大日志各司其职,共同保障MySQL的事务特性和数据可靠性。

2301_80163384的博客 683

MySQL的redo log、undo log和binlog深度解析

Redo log,即重做日志,是InnoDB存储引擎特有的一种物理日志。它记录了对数据页的物理修改,例如“某个数据页的某个偏移量处的值从X改成了Y”。redo log是顺序写入的,并且是循环使用的,当写满时会从头开始覆盖。Undo log,即回滚日志,也是InnoDB存储引擎特有的一种逻辑日志。它记录了数据在被修改前的状态,用于在事务回滚时将数据恢复到修改前的样子。

weixin_56018532的博客 890

面试不用慌!跟着老司机吃透Redo log 与 Binlog

长按扫描上方二维码了解MySQL是常用的数据库存储应用,我们利用它存储信息、查询信息、处理事务。特别是为了提高可用性会用到事务一致性、主从复制、数据恢复等功能。我们在使用这些功能的时候,是...

石杉的架构笔记 1259

MySQL日志系统:Binlog、Redo Log与Undo Log详解

数据库日志系统是保障数据一致性和实现故障恢复的核心机制。MySQL采用多日志协同架构,其中二进制日志(Binlog)记录所有数据变更操作,是实现主从复制的基础;重做日志(Redo Log)通过WAL机制提升写入性能,解决随机IO问题;回滚日志(Undo Log)支持事务回滚和MVCC实现。合理配置日志参数对数据库性能影响显著,如调整innodb_log_file_size可提升30%以上TPS。在生产环境中,建议采用ROW格式的Binlog配合定期清理策略,同时为日志文件分配独立磁盘。这些日志机制共同构成了

365

蓝易云 - MySQL的Redo Log与Binlog机制对照分析

对数据库管理员而言,理解这两种日志的区别是管理MySQL数据库的关键。合理配置redo log能够确保数据库在系统崩溃后能够迅速恢复,而合理配置binlog不仅有助于数据的复原和恢复,也是实现数据库高可用架构中数据一致性的重要工具。应优化日志文件的大小和轮换策略,以避免性能瓶颈。在进行主从复制时,需要保证binlog开启,并合理配置复制模式以提高效率并降低错误。需要定期进行日志备份,确保在数据丢失时能够及时恢复。

高性价比服务器就选:蓝易云 616

MySql的redo log

Mysql中Redo log保证了事务的一致性

u010741032的博客 766

MySQL深入-binlog日志及事务日志

1.什么是binlog? binlog是一个二进制格式的文件,用于记录用户对数据库更新的SQL语句信息,例如更改数据库表和更改内容的SQL语句都会记录到binlog里,但是对库表等内容的查询不会记录。 - 触发变更的操作,增删改都算; 二进制格式的,所以无法使用cat或者vi等去查看,需要使用mysqlbinlog去查看 2.binlog干吗使? 主从复制; 数据库宕机时候用...

ljxbbss的博客 6982

MySQL中undo log、redo log、bin log相关知识

但是在事务提交的时候,会将该事务对应的undolog放入到删除列表中,未来通过purge来删除。当事务提交的时候,innodb不会立即删除undolog,因为后续还可能会用到undolog,如隔离级别为repeatableread时,事务读取的都是开启事务时的最新提交行版本,只要该事务不结束,该行版本就不能删除,即undo log不能删除。可以认为当delete一条记录时,undolog中会记录一条对应的insert记录,反之亦然,当update一条记录时,它记录一条对应相反的update记录。

matlabcwp的博客 2072

日志模块:redo log和binlog

目录redo log为什么需要redo log概念binlogredo log 和binlog的区别更新语句的执行流程 redo log 为什么需要redo log 因为Innodb是以页为单位进行磁盘交互的,而一个事务很可能只修改一个数据页里面的几个字节,这个时候将完整的数据页刷到磁盘的话,太浪费资源了! 一个事务可能涉及修改多个数据页,并且这些数据页在物理上并不连续,使用随机IO写入性能太差! 因此mysql设计了redo log,具体来说就是只记录事务对数据页做了哪些修改,这样就能完美地解决性能问

qq_38670588的博客 424

undo log、redo log和bin log

1.undo log是一种用于撤销回退的日志,MYSQL会记录更新前的数据到undo log日志文件里面,当事务回滚或者数据库崩溃时,可以用undo log进行回退2.undo log在事务开始前产生,事务提交时并不会直接删除,而是会将对应的undo log放入删除列表中,后台有专门的线程purge thread进行回收处理。

qq_52896055的博客 241

重学MySQL系列05-redo log与binlog

今天就来聊聊InnoDB是如何保证redo log与binlog两份日志之间的逻辑一致。 两阶段提交 redo log(重做日志)让InnoDB存储引擎拥有了崩溃恢复能力。 binlog(归档日志)保证了MySQL集群架构的数据一致性。 虽然它们都属于持久化的保证,但是则重点不同。 在执行更新语句过程,会记录redo log与binlog两块日志,以基本的事务为单位,redo log在事务执行过程中可以不断写入,而binlog只有在提交事务时才写入,所以redo log与binlog的写入时机不一

每天叫醒自己的不是闹铃 是娟 是梦 是理想。 881
上一篇: 万答#18,MySQL8.0 如何快速回收膨胀的UNDO表空间
下一篇: 多云部署多主模式的MGR集群,每个云一个MGR 节点,满足业务单元化改造的需求
GreatSQL社区
博客等级 码龄5年 1210粉丝 390原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值