MySQL的Redo Log、Undo Log、Binlog与Replay Log日志

前言

        MySQL数据库作为业界最流行的开源关系型数据库之一,其底层实现涉及多种重要的日志机制,其中包括Redo Log、Undo Log、Binlog和Replay Log。这些日志组件共同确保MySQL数据库系统在面对事务处理、数据恢复和主从复制等方面表现出色。本文主要介绍一下它们的作用分别是什么?

1. Redo Log

1.1 概念

        Redo Log是MySQL保障事务持久性的关键组成部分,它记录了所有对数据库进行的修改操作,以便在系统崩溃或发生故障时能够恢复数据到事务提交的状态。

1.2 工作原理

        Redo log的工作原理主要有以下几个:
记录事务修改操作:

        当一个事务开始时,它对数据库进行修改的操作(例如插入、更新、删除)将会生成对应的Redo Log记录。这些记录包括了修改的数据页、修改前后的数据值等信息。

事务的提交操作:
       事务提交时,Redo Log记录被写入Redo Log缓冲区。Redo Log缓冲区是内存中的一块区域,用于暂时存储事务的Redo Log记录。

文件的循环写入:

        Redo Log文件是一个循环写入的文件,通常包括两个文件,如ib_logfile0ib_logfile1。当一个Redo Log文件写满时,新的记录将开始写入另一个文件,循环使用。

崩溃恢复操作:

        当MySQL实例因为崩溃或其他故障而重新启动时,数据库引擎会检查Redo Log,尤其是最后一个写入的文件。未提交的事务将被回滚,已提交的事务将会被重新执行,通过这个过程来保障数据库的一致性。

1.3 刷盘机制

        Redo Log的刷盘机制主要通过innodb_flush_log_at_trx_commit参数来控制。

1. innodb_flush_log_at_trx_commit=0:

  • Redo Log每秒钟被刷新一次。
  • 数据库性能最佳,但一旦MySQL崩溃,可能会丢失一秒钟的事务。

2. innodb_flush_log_at_trx_commit=1:

  • 每次事务提交时都会将Redo Log刷盘到磁盘。
  • 数据持久性最高,但性能开销也相对较高。

3. innodb_flush_log_at_trx_commit=2:

  • 每次事务提交时将Redo Log写入操作系统的缓存,而不直接刷盘。
  • 操作系统会定期将数据刷盘到磁盘。
  • 在这种情况下,可能会在MySQL实例崩溃时丢失一定量的数据,但相比于值为0的情况,性能有所提高。

2. Undo Log

2.1 概念

Undo Log用于记录事务的逆操作,即撤销操作。主要用于回滚事务和支持多版本并发控制(MVCC)。

2.2 工作原理

记录事务逆操作

  • 当一个事务开始时,MySQL会为该事务分配一个唯一的事务ID。
  • 对于事务的每个修改操作,Undo Log都会记录相应的逆操作,用于回滚。

事务的开始和结束

  • 在事务开始时,MySQL会为该事务分配一个事务开始记录(Transaction Start Record),并将其写入Undo Log。
  • 在事务结束时,MySQL会生成事务结束记录(Transaction End Record)。​​​​​​​

逆操作的记录

  • 对于每个事务修改操作(如插入、更新、删除),Undo Log会记录相应的逆操作,以确保在事务回滚时能够还原数据到修改前的状态。
  • 逆操作包括了旧数据的备份或者对原数据的恢复操作

多版本并发控制(MVCC)

  • Undo Log是MVCC的基础之一,支持并发事务的执行。
  • 当一个事务对数据进行修改时,MySQL不直接在原数据上进行修改,而是在Undo Log中记录修改前的数据。
  • 这使得其他事务可以同时读取原数据,实现了多版本并发控制。

回滚操作

  • 当事务需要回滚时,MySQL会使用Undo Log中的逆操作来撤销事务的修改操作,将数据还原到事务开始时的状态。
  • 这确保了事务的原子性和一致性。

3. Binlog(二进制日志)

3.1 基础概念

        Binlog是MySQL实现主从复制和数据恢复的关键组件。它记录了对数据库的所有修改操作。

        Binlog是一个二进制文件,包含一系列二进制日志事件。这些事件包括对数据的修改、表结构的变更等。

3.2 主从复制

MySQL进行主从复制,从服务器是将主服务器的binlog日志读取并写入到从服务器的replaylog上。

3.3 数据恢复

        通过使用Binlog,可以将数据库还原到特定时间点,应对数据丢失等情况。

3.4 优化Binlog性能

        透过调整sync_binlogbinlog_cache_size等参数,可以提高Binlog的性能。

4. Replay Log(重放日志)

4.1 基础概念

Replay Log是用于重放Binlog的关键组件,它在数据恢复和故障恢复过程中发挥作用。

Replay Log记录了执行过的Binlog事件,以确保在系统发生故障后能够重放这些事件,实现数据的一致性。

4.2 主从复制

       在binlog上已经提过了,Replaylog的作用是用于承接主服务器从binlog读取过来的数据,然后在从服务器上进行重放。

总结

        Redo Log、Undo Log、Binlog和Replay Log是MySQL数据库系统的核心技术,它们协同工作以确保数据库的持久性、一致性和高可用性。通过深入了解这些技术的原理和灵活配置,开发人员和DBA可以更好地利用

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

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

相关文章

pytorch 图像的卷积操作

目录 1.卷积核基本参数说明 2.卷积相关操作说明 3.卷积操作示例 1.卷积核基本参数说明 pytorch进行图像卷积操作之前,需要把图像素格式进行分离,比如一个图像为rgb格式,把R,G,B取出来作为一个ndarray,前文讲过&#…

ARM系列 -- 虚拟化(三)

为了实现虚拟化,虚拟机需要控制系统资源。但是实际的系统资源是在hypervisor直接控制之下,为了实现隔离和安全等方面的考虑,不可能让虚拟机直接控制这些系统资源。 比如,虚拟机想根据具体情况去做电源管理。一个解决办法就是利用…

.net 在ubuntu下动态写入 中文字乱码 解决:ubuntu下添加中文字库

.net 在ubuntu下动态写入图片水印 中文字乱码 解决:ubuntu下添加中文字库 1.安装字体命令 sudo apt install -y fontconfig2.查看已安装的字体 (1)查看linux已安装字体 fc-list(2)查看linux已安装中文字体 fc-li…

字节面试问题

实现三列布局的方法 第一种&#xff1a;可以使用浮动margin 第二种&#xff1a;浮动BFC <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, in…

力扣 第 386 场周赛 解题报告 | 反悔贪心

力扣 第 386 场周赛 解题报告 | 反悔贪心 前言 整体评价 前两天发烧&#xff0c;今天才补完题&#xff08;非常惭愧&#xff09;第三题的二分不容易想到&#xff0c;第四题的 “反悔堆” 这种思想值得学习。 T1 分割数组 思路&#xff1a;通过哈希表保证不存在出现两次以上…

常见的主流媒体有哪些?主流媒体报道的优势

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体胡老师。 主流媒体通常指的是具有广泛影响力和权威性的媒体机构&#xff0c;它们在新闻报道、舆论引导等方面扮演着重要角色。 常见的主流媒体包括但不限于&#xff1a; 电视媒体&#xff1a;如总台…

PHP+vue+mysql高校学生健康管理系统fe93x

。高校学生健康管理平台采用系统设计遵循界面层、业务逻辑层和数据访问层的Web开发三层架构。采用B/S结构,使得系统更加容易维护。高校学生健康 管理平台主要实现角色有管理员和学生,医护人员,辅导员,管理员在后台管理诊断结果模块、医护咨询模块、医护人员模块、医护回复模块、…

国际黄金价格是什么?和黄金价格有何区别?

黄金是世界上最珍贵的贵金属之一&#xff0c;其价值被无数人所垂涎。而国际黄金价格作为市场上的参考指标&#xff0c;直接影响着黄金交易的买卖。那么国际黄金价格到底是什么&#xff0c;与黄金价格又有何区别呢&#xff1f;本文将为您详细解答。 国际黄金价格是指以美元计量的…

多源视频融合平台VMS/smarteye,免费的GB28181 server, 免费的RTMP推流server,RTSP server

海康、大华、宇视等网络摄像机IPcamera及DVR/NVR等多路设备走国标28181接入视频混合融合平台smarteye 第三方国标摄像头走GB28181接入视频融合平台VMS/smarteye&#xff0c; 平台已为设备预分配了SIP帐号&#xff0c;这样免去了找平台人员索要接入SIP帐号的麻烦&#xff0c;可…

深入理解c指针(五)

目录 八、指针与数组 1、数组名的理解 2、使用指针访问数组 3、一维数组传参的本质 4、冒泡排序 5、二级指针 6、指针数组 7、指针数组模拟二维数组 八、指针与数组 int arr[10] {1,2,3,4,5,6,7,8,9,10}; int *p &arr[0]; 1、数组名的理解 某一数组名就是该数组…

深度学习PyTorch 之 RNN-中文多分类

关于RNN的理论部分我们已经在前面介绍过&#xff0c;所以这里直接上代码 1、 数据部分 1.1 读取数据 # 加载数据 data_path ./data/news.csv data pd.read_csv(data_path)# 预览数据的前几行 data.head()数据是csv格式&#xff0c;只有两列&#xff0c;第一列是标签&#…

Django数据库配置+迁移

目录 配置settings.py 在项目下新建bookstore应用 将新建应用添加到项目中 创建模型 执行数据库信息迁移 新增或修改数据库的信息 配置settings.py 找到项目同名文件夹下的settings.py文件&#xff0c;将原有的django默认配置修改为下图 引擎只需要将最后一部分改为对应…

网络:IPv6

1、由于IPv4地址资源枯竭&#xff0c;所以产生了IPV6。 版本长度地址数量IPv432 bit4 294 967 296IPv6128 bit340 282 366 920 938 463 374 607 431 768 211 456 2、IPv6的基本报头在IPv4报头基础上&#xff0c;增加了流标签域&#xff0c;去除了一些冗余字段&#xff0c;使报…

Mint_21.3 drawing-area和goocanvas的FB笔记(一)

一、关于freebasic和goocanvas Linux下的FreeBasic是C的一种实现&#xff0c;有指针、类、线程&#xff0c;正则表达式&#xff0c;可内嵌asm和其它语言c等&#xff0c;c的h库几乎都能改写后使用(不能直接用&#xff0c;它的.bi可从h近乎自动转换)&#xff0c;老的Quick Basic…

搭建服务器及跨域处理

使用内置的模块搭建服务器 自己电脑: 域名:localhost ip:127.0.0.1 http模块搭建服务器 const http = require(http)// 创建一个http对应的服务器,每次改完服务器的代码后都需要重新启动下服务器 /*方式一: const server = http.createServer((request,response)=>{…

第三章-Mybatis源码解析-以xml方式走流程-mapper解析(四)

3.2.2.7 selectKey解析 回到 XMLStatementBuilder.processSelectKeyNodes 的方法 private void processSelectKeyNodes(String id, Class<?> parameterTypeClass, LanguageDriver langDriver) {// 拿到所有 selectKey 节点List<XNode> selectKeyNodes context.…

jmeter 压测数据库

当前版本&#xff1a; jmeter 5.6.3mysql 5.7.39 简介 JMeter 是一个开源的 Java 应用程序&#xff0c;主要用于进行性能测试和负载测试。它支持多种协议&#xff0c;包括但不限于 HTTP、HTTPS、FTP、JDBC 以及各种 Web Services。对于数据库的压力测试可以使用 JDBC 协议与数…

【Docker】狂神说

图片后补 官网&#xff1a; https://www.docker.com/ Docker概述 Docker为什么出现 原因&#xff1a;环境配置不能跨平台 方案 传统方式&#xff1a;jar&#xff08;开发人员&#xff09; 部署&#xff08;运维人员&#xff09; 解决方式&#xff1a;开发打包上线一套流程 …

spring boot学习第十三篇:使用spring security控制权限

该文章同时也讲到了如何使用swagger。 1、pom.xml文件内容如下&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instanc…

LeetCode238题:除自身以外数组的乘积(python3)

代码思路&#xff1a; 当前位置的结果就是它左部分的乘积再乘以它右部分的乘积&#xff0c;因此需要进行两次遍历&#xff0c;第一次遍历求左部分乘积&#xff0c;第二次遍历求右部分的乘积&#xff0c;再将最后的计算结果一起求出来。 class Solution:def productExceptSelf(…