MySQL 的binlog 、undolog 、redolog

news2024/12/23 14:09:54

Binlog (二进制日志)

bin Log 作用

用于记录所有修改数据库数据的 SQL 语句或行级别的变化,主要用于主从复制和数据恢复。

binlog格式

  • STATEMENT模式:binlog里面记录的就是SQL语句的原文。优点是并不需要记录每一行的数据变化,减少了binlog日志量,节约IO,提高性能。缺点是在某些情况下会导致master-slave中的数据不一致

  • ROW模式:不记录每条SQL语句的上下文信息,仅需记录哪条数据被修改了,修改成什么样了,解决了STATEMENT模式下出现master-slave中的数据不一致。缺点是会产生大量的日志,尤其是alter table的时候会让日志暴涨

  • MIXED模式:以上两种模式的混合使用,一般的复制使用STATEMENT模式保存binlog,对于STATEMENT模式无法复制的操作使用ROW模式保存binlog,MySQL会根据执行的SQL语句选择日志保存方式

示例 1:使用不确定函数
某些情况下,使用不确定函数(如 UUID()、NOW() 等)会导致 STATEMENT 模式无法复制,因为每次执行时返回的结果可能不同。此时,ROW 模式可以准确记录每行数据的变化。

INSERT INTO my_table (id, value) VALUES (UUID(), NOW());

在 STATEMENT 模式下,这条语句可能在主库和从库中插入不同的 UUID 和 NOW 值。而在 ROW 模式下,每行数据的具体值会被记录并复制到从库。

示例 2:复杂事务
复杂事务中可能包含多个步骤,每一步骤都会影响数据的一致性。在这种情况下,使用 ROW 模式可以确保每个步骤的结果都被准确记录和复制。

BEGIN;
UPDATE my_table SET value = value + 1 WHERE id = 1;
DELETE FROM my_table WHERE id = 2;
INSERT INTO my_table (id, value) VALUES (3, 'test');
COMMIT;

在 STATEMENT 模式下,每个语句会被记录并在从库执行,但如果有依赖顺序或其他条件的语句,可能导致复制不一致。而在 ROW 模式下,每行数据的变化都会被准确记录。

bin Log记录顺序

  • 事务提交之前,MySQL 会将事务的所有修改记录到 binlog cache(binlog 缓冲区)。
  • 事务提交时,MySQL 会将 binlog cache 中的内容写入磁盘上的 binlog 文件。
  • MySQL 保证 binlog 写入后,事务才会真正提交

Redo Log(重做日志)

MySQL里常说的WAL技术,全称是Write Ahead Log,即当事务提交时,先写redo log,再修改页。

也就是说,当有一条记录需要更新的时候,InnoDB会先把记录写到redo log里面,并更新Buffer Pool的page,这个时候更新操作就算完成了

Buffer Pool是物理页的缓存,对InnoDB的任何修改操作都会首先在Buffer Pool的page上进行,然后这样的页将被标记为脏页并被放到专门的Flush List上,后续将由专门的刷脏线程阶段性的将这些页面写入磁盘。

Redo Log 作用

用于保证事务的持久性(即使数据库崩溃后,也能恢复到最新的提交状态)。

Redo Log 结构

InnoDB的redo log是固定大小的,比如可以配置为一组4个文件,每个文件的大小是1GB,循环使用,从头开始写,写到末尾就又回到开头循环写(顺序写,节省了随机写磁盘的IO消耗)
在这里插入图片描述
Write Pos是当前记录的位置,一边写一边后移,写到第3号文件末尾后就回到0号文件开头。

Check Point是当前要擦除的位置,也是往后推移并且循环的,擦除记录前要把记录更新到数据文件

Write Pos和Check Point之间空着的部分,可以用来记录新的操作。如果Write Pos追上Check Point,这时候不能再执行新的更新,需要停下来擦掉一些记录,把Check Point推进一下

当数据库发生宕机时,数据库不需要重做所有的日志,因为Check Point之前的页都已经刷新回磁盘,只需对Check Point后的redo log进行恢复,从而缩短了恢复的时间

当缓冲池不够用时,根据LRU算法会溢出最近最少使用的页,若此页为脏页,那么需要强制执行Check Point,将脏页刷新回磁盘。

Redo log buffer刷盘

InnoDB首先将redo log放入到redo log buffer,然后按一定频率将其刷新到redo log file

下列三种情况下会将redo log buffer刷新到redo log file

  • Master Thread每一秒将redo log buffer刷新到redo log file

  • 每个事务提交时会将redo log buffer刷新到redo log file

  • 当redo log缓冲池剩余空间小于1/2时,会将redo log buffer刷新到redo log file

Redo Log 记录顺序

  • 事务开始时,MySQL 会将对数据的修改先写入内存中的缓冲区。
  • 事务进行过程中,对数据的修改会先写入 redo log buffer(重做日志缓冲区)。
  • 事务提交时,MySQL 会将 redo log buffer 中的数据刷新(fsync)到磁盘上的 redo log 文件。
  • 一旦 redo log 写入成功,事务才算真正提交

Undo Log (回滚日志)

Undo Log 作用

用于支持事务的回滚操作,保证数据的一致性和隔离性。

Undo Log记录顺序

  • 当一个事务对数据进行修改前,会先记录一份旧的数据快照到 undo log。
  • 如果事务需要回滚,MySQL 会使用 undo log 将数据恢复到修改前的状态。
  • undo log 在事务提交后,会被标记为可删除状态,并在后台逐步清理。

Binlog 、Undolog 、Redolog整体执行顺序

在一个事务的生命周期内,这些日志的记录顺序通常如下:

开始事务

对数据进行修改

  • 写入 undo log。
  • 写入 redo log buffer。
  • 写入 binlog cache。

事务提交:

  • 刷新 redo log buffer 到磁盘。
  • 写入 binlog cache 到 binlog 文件。
  • 事务提交完成,数据对外可见。

Mysql 异常恢复机制

Undo Log

作用:Undo log 用于回滚未提交的事务,并支持多版本并发控制(MVCC)。
恢复:当 MySQL 重启时,会使用 undo log 回滚所有未提交的事务,以确保数据库处于一致的状态。

  • MySQL 会扫描 undo log,找到所有未提交的事务,并逐一回滚这些事务的操作。

Redo Log

作用:Redo log 记录已提交事务的修改,用于崩溃恢复。
恢复:当 MySQL 重启时,会使用 redo log 重做所有已提交但尚未刷入数据文件的事务。

  • MySQL 会扫描 redo log,将所有已提交的事务重新应用到数据文件中,确保数据持久化。

Binlog

作用:Binlog 用于记录所有修改数据的 SQL 语句或行级别的变化,主要用于主从复制和数据恢复。
恢复:在 MySQL 异常后,binlog 保证事务提交的持久性。

  • 事务在提交之前,binlog cache 的内容会刷新到 binlog 文件。
  • 如果 MySQL 在事务提交前崩溃,binlog 中不会有该事务的记录,确保了数据的一致性。

综上

Undo Log:在修改数据前记录旧数据快照,支持事务回滚,保证数据一致性和隔离性。

Redo Log:事务修改的数据先写入 redo log buffer,事务提交时刷新到磁盘,保证事务持久性。

Binlog:在事务提交之前记录所有修改到 binlog cache,事务提交时写入 binlog 文件,支持主从复制和数据恢复。

通过这种日志记录机制,MySQL 能够在发生故障时恢复数据,并保证数据的一致性和持久性

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1970380.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

1990-2022年 上市公司-战略差异度(原始数据、计算代码、参考文献和最终计算结果)

上市公司战略差异度是衡量企业在战略制定和实施过程中所展现的独特性和创新性的指标。它体现了公司对市场环境、行业趋势及自身能力的独特见解和战略布局。通过分析上市公司的战略差异度,可以深入理解企业的市场竞争策略、行业定位和发展方向。 战略差异度的重要性…

Docker镜像拉取失败解决方案

文章目录 问题及分析解决方案1.先排查DNS2.修改源3.代理配置4.重启docker服务 问题解决 问题及分析 今天我用docker拉取镜像的时候报错 error pulling image configuration: download failed after attempts6: dial tcp xxx.xx.xxx.xx:xxx: i/o timeout 连接超时大概率以下两个…

在 Mac 上进行本地 LLM 微调(M1 16GB)

适合初学者的 Python 代码演练 (ft. MLX) 欢迎来到雲闪世界。本文展示了如何使用 Google Colab 上的单个(免费)GPU 微调 LLM。虽然该示例(以及许多其他示例)可以在 Nvidia 硬件上轻松运行,但它们并不容易适应 M 系列 M…

Windows10点击文件夹右键卡死的解决办法

1、首先同时按下【WinR】打开运行页面,输入命令【regedit】按下回车或者点击确定。 2、打开注册表编辑器后,定位到如下位置“HKEY_CLASSES_ROOT\Directory\Background\Shellex\ContextMenuHandlers”。 3、然后在其中将所有名为“New”的文件或项全部删…

边缘计算平台模型-Gemma 2

我们生活在一个充满科技创新的时代,这已经成为我几乎每天都会重复的话题。这一次,我们带来了一个重磅消息:Google刚刚发布了Gemma 2,这是一款拥有22亿参数的指令调优模型。这意味着它已经在指令及其响应上进行了训练或微调。Gemma…

Navicat 数据传输详解(将源数据库的多个表结构与数据复制到目标数据库)

Navicat 数据传输详解(将源数据库的多个表结构与数据复制到目标数据库) 1.打开Navicat ,先连接源数据库和目标数据库。2.点击工具选项卡,选择数据传输3.左边是源数据库,右边是目标数据库。4.选择要同步的表。5.开始同步…

为什么很多人都无法解决 VSCode C 系列调试问题 (经验分享 有用)

目录 个人失败案例 断点打了 (也没用) lagunch配置了 (也没用) 插件安装了 (也没用) 无中文路径 (也没用) ​编辑 失败案例分析✨ llvm-mingw 编译器为例 main.cpp launch.json 个人失败案例 你们都很棒 很优秀 ,环境方面也正常,但为什么还是…

【海外高校联合支持举办 | 学术大咖fellow汇聚】2024年人工智能与数字化管理国际会议(ICAIDM 2024,9月20-22)

2024年人工智能与数字化管理国际会议将于2024年9月22-24日在中国江苏省南京市隆重召开。 在快速发展的数字时代,人工智能已成为驱动创新、优化运营和塑造未来的关键技术。随着人工智能技术的日益成熟及其在各行各业的深入应用,如何有效地进行数字化管理…

Elasticsearch大数据搜索引擎(经典版)(电子版教程)

前言 在信息时代,可供获取的数据加速涌现,我们可以通过搜索引警来挖掘大数据的价值,百度就是一个大的数据搜索引擎。Lucene 是一个 Java 语言开发的开源全文检索引擎工具包。Lucene 穿了一件json 的外衣,就是 Elasticsearch。Ela…

平衡三进制存算一体架构

PS:天天水一贴,快乐又舒心。。。 1、存算一体概念 最近想搞平衡三进制的虚拟机,但是写来写去都感觉不对味,能用是能用,但写起来感觉就是很奇怪,用了二种编码,想来想去是不够原生三进制的编写,有…

企业差旅支出“降本增效”CFO避坑指南之三—— 仅凭一单,更换差旅供应商?

在企业运营过程中,差旅支出是CFO们需要精细管理的重要成本项。然而,许多中小企业在商旅供应商的选择上,往往容易陷入“仅凭一单价格高,即更换差旅供应商”的误区。这种做法忽视了商旅市场的复杂性和多样性,可能导致企业…

通过 Python脚本,实现字体文件otf,ttf文件大小的减少

FontTools 是一个用于操作字体文件的 Python 库。它支持多种字体格式,包括 TrueType (TTF) 和 OpenType (OTF),并提供功能来编辑、合并、子集化和生成字体文件 前提:安装了 Python 1、安装 fonttools 库 pip3 install fonttools2、编写脚本…

Qt项目——文本编辑器(功能模块④)

项目地址:GitHub - Outlier9/CatEditor: Cat文本编辑器--Qt 有帮助的话各位点点 star 啦,感谢! 如果有需要学习该项目的人,觉得看文档较为困难,可以加我联系方式,给github点个star后可免费提供学习视频&…

颠覆虚拟试衣行业标准!阿里发布OutfitAnyone:任意服装+任意人!

文章链接:https://arxiv.org/pdf/2407.16224 git链接:https://humanaigc.github.io/outfit-anyone/ huggingface: https://huggingface.co/spaces/HumanAIGC/OutfitAnyone 亮点直击 顶尖逼真度:OutfitAnyone 方法为虚拟试穿设立了新的行业标准&#xff0…

【Redis 进阶】持久化(RDB AOF)

Redis(数据存储在内存中)支持 RDB 和 AOF 两种持久化(和 MySQL 里的持久性是一回事,把数据存储在硬盘上,重启进程 / 主机后数据仍然存在 —— 持久;把数据存储在内存上,重启进程 / 主机后数据消…

夏日清凉体验:气膜体育馆的运动之乐—轻空间

夏季的酷热常常让人们望而却步,尤其是对于热爱运动的人来说,寻找一个凉爽舒适的运动场所显得尤为重要。气膜体育馆因其独特的建筑特点和环境控制系统,成为了炎炎夏日里篮球、羽毛球等运动项目的理想场地。轻空间将探讨在气膜体育馆内运动的独…

活动报道 | 盘古信息携IMS OS+小快轻准产品集亮相东莞市中小数转试点供需对接会

8月1日,由东莞市工业和信息化局主办,南城街道经济发展局承办,东莞市软件行业协会协办的东莞市中小企业数字化转型城市试点供需对接会(城区和水乡新城片区)隆重召开。市工业和信息化局副局长江小敏、市工业和信息化局信…

揭秘 CPU 是如何执行计算机指令的

1 CPU 内部逻辑结构 之前的文章《揭秘代码是如何变成机器码的》,其中说到,如果从软件的角度来讲,CPU 就是一个执行各种计算机指令(Instruction Code)的逻辑机器。 那么这个逻辑机器内部是什么样的?又是如…

寥寥数笔,动画自成!阿里Tora: 首个轨迹引导的DiT创新实现精确运动控制视频生成

论文链接:https://arxiv.org/pdf/2407.21705 项目链接:https://ali-videoai.github.io/tora_video/ 亮点直击 本文引入了Tora,这是第一个轨迹导向的DiT用于视频生成。如下图2所示,Tora无缝整合了广泛的视觉和轨迹指令,…

数据挖掘实战-基于Prophet时间序列模型预测阿里巴巴股票价格趋势(文末送书)

🤵‍♂️ 个人主页:艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞&#x1f4…