Mysql数据库Redo日志和Undo日志的理解

数据库redo日志和undo日志

  • 1、redo日志
    • 1.1 redo日志的作用
      • 1.1.1 不使用redo日志的问题
      • 1.1.2 使用redo日志的好处
    • 1.2 redo日志刷盘策略
  • 2、undo日志
    • 2.1 undo日志的作用
    • 2.2 undo日志的简要生成过程

1、redo日志

事务的4大特性(ACID):原子性、一致性、隔离性、持久性,是基于什么机制实现的?

  1. 隔离性:由锁机制实现。
  2. 原子性、一致性、持久性:由redo日志和undo日志来保证。
    1)redo日志:提供再写入能力,恢复提交事物修改的页操作,保证事务的持久性。
    2)undo日志:提供回滚能力,可以恢复到某个特定的版本,保证事务的原子性、一致性。
    3)注意:redo日志和undo日志不是正向和反向的关系,他们都属于数据库事务的一种恢复操作,只是解决的问题不同而已。redo日志针对的是事务写过程中,在保证数据持久性的基础上,提升了事务提交的速度。undo日志针对的是事务需要回滚时,能保证数据一致性。

1.1 redo日志的作用

1.1.1 不使用redo日志的问题

InnoDb存储引擎是以页为单位来管理存储空间的。由于cpu和磁盘处理速率差距非常大,因此所有变更都必须先更新内存中的缓冲池(Buffer Pool),然后再以一定的频率被刷入磁盘。

这样的话会存在一些问题:
1、修改量与刷新磁盘工作量严重不成正比:有时候仅仅更新了数据库中某一行的某一列的一个字段,但是事务提交的时候需要刷新一个完整页(16KB)到磁盘上。效率上和速度上都不高。
2、随机IO刷新较慢:一个事务可能包含很多语句,对应的数据不一定在磁盘相邻的页上,当把数据从buffer pool刷入到磁盘上时,需要进行很多的随机IO,而随机IO比顺序IO要慢很多,因此这个事务的耗时会非常久。

1.1.2 使用redo日志的好处

使用redo日志,即数据从缓冲池(buffer pool)刷入到redo日志中,该事务就算提交成功了。即使此时数据库系统崩溃了,数据库重启的时候,系统也能从redo日志中将刚刚那次事务的变更刷入到磁盘中。

同时由于redo日志时顺序写入,因此速度要比随机IO快很多。

这种策略叫Write Ahead Log(预先日志持久化),即先写入到顺序IO的redo日志上,再写入到数据磁盘上。
在这里插入图片描述

1.2 redo日志刷盘策略

使用redo日志后也存在一个问题,即什么时候将redo log buffer刷入到redo日志上呢?

Innodb提供了3种策略,通过innodb_flush_log_at_trx_commit参数进行选择:

  1. 设置为0:每次事务提交时不进行刷盘操作。(系统默认master thread每隔1s进行一个redo日志的同步)。
  2. 设置为1:每次事务提交时都进行刷盘动作(系统默认值)。
  3. 设置为2:每次事务提交时都只把redo log buffer内容写入page cache,不进行同步,由系统决定什么时候刷入到磁盘。

在这里插入图片描述

2、undo日志

2.1 undo日志的作用

  • 作用1:回滚数据
    回滚数据时逻辑上地将数据回滚到事务开始前,实际磁盘页上的数据是进行了变更的。

比如执行insert之前,会写一条delete的语句到undo日志中,一旦事务回滚,则会执行这条delete语句。

  • 作用2:MVCC
    InnoDb存储引擎中的MVCC是通过undo日志实现的。当用户读取一行记录时,若该记录已被其他未提交事务占用,当前事务可以通过undo日志读取改行记录之前版本的信息,从而实现了非锁定的读取。

2.2 undo日志的简要生成过程

以update操作举例,简要过程如下

  1. 开启事务,执行update操作
  2. 缓存中不存在待update数据,则从磁盘中查询并加载
  3. 记录可以回滚语句到undo log中
  4. 执行update操作语句
  5. 将操作结果写入到redo log buffer中
  6. 将redo log buffer结果以一定的频率写入到redo log种
  7. 提交事务后,将结果写入到bin log文件

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Windows配置cuda,并安装配置Pytorch-GPU版本

文章目录 1. CUDA Toolkit安装2. 安装cuDNN3. 添加环境变量配置Pytorch GPU版本 博主的电脑是Windows11,在安装cuda之前,请先查看pytorch支持的版本,cuda可以向下兼容,但是pytorch不行,请先进入:https://py…

Oracle 数据库 dmp文件从高版本导入低版本的问题处理

当前有个需求是将oracle 19c上的数据备份恢复到oracle 11g上使用。我们通过exp命令远程进行备份,然后通过imp进行恢复时出现IMP-00010: not a valid export file, header failed verification报错。 这是数据库版本问题,在使用exp命令导出的时候使用的客…

RedisDesktopManager新版本不再支持SSH连接远程redis后

背景 RedisDesktopManager(又名RDM)是一个用于Windows、Linux和MacOS的快速开源Redis数据库管理应用程序。这几天从新下载RedisDesktopManager最新版本,结果发现新版本开始不支持SSH连接远程redis了。 解决方案 第一种 根据网上有效的信息,可以回退版…

C# 读取多种CAN报文文件转换成统一格式数据,工具类:CanMsgRead

因为经常有读取CAN报文trace文件的需求,而且因为CAN卡不同、记录软件不同会导致CAN报文trace文件的格式都有差异。为了方便自己后续开发,我写了一个CanMsgRead工具类,只要提供CAN报文路径和CAN报文格式的选项即可将文件迅速读取转换为统一的C…

REDIS2.0

string list hash set 无序集合 声明一个key,键里面的值是元素,元素的类型是string 元素的值是唯一的,不能重复 多个集合类型之间可以进行并集,交集,集查的运算 sadd test1 a b c c d :添加5个元素&am…

【源码 导入教程 文档 讲解】基于springboot校园新闻管理系统源码和论文

可做计算机毕业设计JAVA、PHP、爬虫、APP、小程序、C#、C、python、数据可视化、大数据、文案 传统信息的管理大部分依赖于管理人员的手工登记与管理,然而,随着近些年信息技术的迅猛发展,让许多比较老套的信息管理模式进行了更新迭代&#xf…

分布式项目___某污水处理项目

一.分布式项目___污水处理项目 项目地址:https://gitee.com/yanyigege/collaborative-water-springboot.git ​ 1.项目背景 总公司在全国各地有处理污水的项目部,各项目部处理自己的污水,总部需要监控各地分项目部每天处理污水的原料用量,掌握各分部的污水处理情况 ​ 2.功…

小程序基础 —— 08 文件和目录结构

文件和目录结构 一个完整的小程序项目由两部分组成:主体文件、页面文件: 主体文件:全局文件,能够作用于整个小程序,影响小程序的每个页面,主体文件必须放到项目的根目录下; 主体文件由三部分组…

计算机网络 (7)物理层下面的传输媒体

一、定义与位置 物理层是计算机网络体系结构的最低层,它位于传输媒体(传输介质)之上,主要作用是为数据链路层提供一个原始比特流的物理连接。这里的“比特流”是指数据以一个个0或1的二进制代码形式表示。物理层并不是特指某种传输…

基于FPGA的2ASK+帧同步系统verilog开发,包含testbench,高斯信道,误码统计,可设置SNR

目录 1.算法仿真效果 2.算法涉及理论知识概要 2.1 2ASK调制解调 2.2 帧同步 3.Verilog核心程序 4.完整算法代码文件获得 1.算法仿真效果 vivado2019.2仿真结果如下(完整代码运行后无水印): 设置SNR8db 设置SNR20db 整体波形效果&…

各种 Amazon EBS 卷类型

Amazon Elastic Block Store(EBS)是 Amazon Web Services(AWS)提供的一项持久性块存储服务,它允许用户为 EC2 实例提供高效、可靠的存储。EBS 卷是 AWS 云环境中存储数据的基础组件,广泛应用于数据库、文件…

nvidia_gpu_exporter 显卡监控

导入 grafana/dashboard.json https://github.com/utkuozdemir/nvidia_gpu_exporter/blob/master/grafana/dashboard.json参考 nvidia_gpu_exporter

jvm排查问题-实践追踪问题 与思路--堆内堆外内存泄漏排查方针

概述 排查问题的一般思路是:现象 ——> 直接原因 ——>根本原因。 从问题现象出发,可以分为 应用逻辑问题、资源使用问题、虚拟机异常: 应用逻辑可能导致报错增加、死锁、程序退出等;资源问题主要集中在CPU上升和内存上升(OOM Kill);虚拟机问题通常包括GC问题、进…

CPT203 Software Engineering 软件工程 Pt.1 概论和软件过程(中英双语)

文章目录 1.Introduction1.1 What software engineering is and why it is important(什么是软件工程,为什么它很重要)1.1 We can’t run the modern world without software(我们的世界离不开软件)1.1.1 What is Soft…

【Java数据结构】LinkedList与链表

认识LinkedList LinkedList就是一个链表,它也是实现List接口的一个类。LinkedList就是通过next引用将所有的结点链接起来,所以不需要数组。LinkedList也是以泛型的方法实现的,所以使用这个类都需要实例化对象。 链表分为很多种,比…

从0入门自主空中机器人-2-2【无人机硬件选型-PX4篇】

1. 常用资料以及官方网站 无人机飞控PX4用户使用手册(无人机基本设置、地面站使用教程、软硬件搭建等):https://docs.px4.io/main/en/ PX4固件开源地址:https://github.com/PX4/PX4-Autopilot 飞控硬件、数传模块、GPS、分电板等…

详解MySQL在Windows上的安装

目录 查看电脑上是否安装了MySQL 下载安装MySQL 打开MySQL官网,找到DOWNLOADS 然后往下翻,找到MySQL Community(GPL) Downloads>> 然后找到MySQL Community Server 然后下载,选择No thanks,just start my download. 然后双击进行…

【git】(一)在vscode上使用git进行版本控制(结合指令、含示例)

vscode中的git插件将git操作从git指令简化到简单的图形界面操作,不用再去记忆git指令,操作简单直观了很多。第一次使用时,为了加深理解,我将一些基本操作和该操作底层使用的命令结合起来,并包含实例,方便学…

安卓入门二 Kotlin基础

Kotlin Kotlin的历史 Kotlin由Jet Brains公司开发设计,2011年公布第一版,2012年开源。 2016年发布1.0正式版,并且Jet Brains在IDEA加入对Kotlin的支持,安卓自此又有新的选择。 2019年谷歌宣布Kotlin成为安卓第一开发语言&#x…

【MATLAB第111期】基于MATLAB的sobol全局敏感性分析方法二阶指数计算

【MATLAB第111期】基于MATLAB的sobol全局敏感性分析方法二阶指数计算 一、简介 在MATLAB中计算Sobol二阶效应指数通常涉及到全局敏感性分析(Global Sensitivity Analysis, GSA),其中Sobol方法是一种流行的技术,用于评估模型输入…