MySQL三大日志—— binlog、redoLog、undoLog 详解

前言:

日志是mysql数据库的重要组成部分,记录着数据库运行期间各种状态信息,能帮助我们进行很多容错及分析工作,其中有三大日志与我们这些开发者息息相关,本文将介绍binlog、redoLog、undoLog三种日志:



1. redoLog 重做日志

在数据库系统中,重做日志(redo log)用于确保在发生故障时数据的完整性和一致性。重做日志缓冲区(redo log buffer)是内存中的一段区域,用于临时存储待写入磁盘的重做日志记录。

当数据库系统执行数据更改(如INSERT、UPDATE、DELETE)时,这些操作会先记录在重做日志缓冲区中。然后,数据库会在适当的时间将这些重做日志缓冲区的内容写入重做日志文件中,以便在系统故障时可以重放这些日志来恢复数据。

在实际的数据库实现中,例如Oracle或MySQL,写入重做日志到磁盘的操作通常是异步进行的,以提高性能。当事务提交时,重做日志缓冲区的内容可能并不立即刷新到重做日志文件,而是由后台进程定期进行。

以下是一个简化的伪代码示例,描述了重做日志缓冲区内容的写入过程:

-- 假设的数据库操作
BEGIN TRANSACTION;
-- 更新操作
UPDATE table_name SET column_name = 'new_value' WHERE condition;
-- 将重做日志缓冲区内容写入重做日志文件
WRITE_REDO_LOG_TO_FILE();
COMMIT TRANSACTION;


1.1 为什么需要redo log


我们都知道,事务的四大特性里面有一个是持久性,具体来说就是只要事务提交成功,那么对数据库做的修改就被永久保存下来了,不可能因为任何原因再回到原来的状态。

事务在运行过程中,都是在内存的Buffer Pool修改页面,事务提交后,这些被修改后的脏页并不会立刻刷盘(立刻刷盘开销太大,一方面是一个页面可能就修改了一点点,将整个页面刷盘不值当,另一方面是一个事务会涉及不同的页面,如果将这些页面都刷盘会产生很多的随机IO)。
但如果不采取其他措施,那么在事务提交后MySQL发生故障导致内存中数据丢失,那么这个提交事务作出的更改也会丢失。

那么mysql是如何保证内存和磁盘的一致性的呢?最简单的做法是在每次事务提交的时候,将该事务涉及修改的数据页全部刷新到磁盘中。但是这么做会有严重的性能问题,主要体现在两个方面:

  1.   因为Innodb是以页为单位进行磁盘交互的,而一个事务很可能只修改一个数据页里面的几个字节,这个时候将完整的数据页刷到磁盘的话,太浪费资源了!
  2.   一个事务可能涉及修改多个数据页,并且这些数据页在物理上并不连续使用随机IO写入性能太差!

所以这里就需要引入redo日志对任意页面进行修改的操作都会生成redo日志,在事务提交时,只要保证生成的redo日志成功落盘即可,这样,即使MySQL发生故障导致内存中的数据丢失,也可以根据已落盘的redo日志恢复数据
 

1.2 redo log的基本概念


redo log是InnoDB存储引擎层的日志又称重做日志文件,用于记录事务操作的变化,记录的是数据修改之后的值不管事务是否提交都会记录下来。一个事务生成的redo日志是按顺序写入磁盘的,是顺序IO,在实例介质失败(media failure)时,redo log文件就能派上用场,如数据库掉电,InnoDB存储引擎会使用 redo log恢复到掉电前的时刻,以此来保证数据的完整性。

redo log包括两部分:

  • 一个是内存中的日志缓冲(redo log buffer)
  • 另一个是磁盘上的日志文件(redo log file)

mysql每执行一条DML语句,先将记录写入redo log buffer,后续某个时间点再一次性将多个操作记录写到redo log file。这种先写日志,再写磁盘的技术 就是MySQL里经常说到的WAL(Write-Ahead Logging) 技术。


 

1.3 redo log记录形式


redo log日志的大小是固定的,即记录满了以后就从头循环写。
redolog记录方式:

  • 简单的redo日志 —— 记录哪个表空间中的哪个页面哪个位置开始多少个节点要修改成什么
  • 复杂的redo日志 —— 记录了对哪个表空间的哪个页面进行修改存储了对该页面进行修改操作的一些必备要素重启时,MySQL会根据redo日志的类型,将redo日志中的必备要素作为参数,调用日志类型对应的函数,恢复数据。

在计算机操作系统中,用户空间(user space)下的缓冲区数据一般情况下是无法直接写入磁盘的,中间必须经过操作系统内核空间(kernel space)缓冲区(OS Buffer)

因此,redo log buffer 写入redo log file实际上是先写入OS Buffer,然后再通过系统调用fsync()将其刷到redo log file中。


 

2.binlog

2.1 binlog基本概念

binlog是属于MySQL Server层面的,又称为归档日志,属于逻辑日志,是以二进制的形式记录的,用于记录数据库执行的写入性操作(不包括查询)信息,依靠binlog是没有crash-safe能力的        

  • 啥是逻辑日志啥是物理日志:
  • 逻辑日志:可以简单理解为记录的就是sql语句
  • 物理日志:因为mysql数据最终是保存在数据页中的,物理日志记录的就是数据页变更

另外,binlog是通过追加的方式进行写入的,可以通过max_binlog_size参数设置每个binlog文件的大小,当文件大小达到给定值之后,会生成新的文件来保存日志

2.2 binlog使用场景


在实际应用中,binlog的主要使用场景有两个,分别是主从复制数据恢复

  1.  主从复制:在Master端开启binlog,然后将binlog发送到各个Slave端Slave端重放binlog从而达到主从数据一致。
  2.  数据恢复:通过使用mysqlbinlog工具来恢复数据。 

 总结:确保事务的持久性。防止在发生故障的时间点,尚有脏页未写入磁盘,在重启mysql服务的时候,根据redo log进行重做从而达到事务的持久性这一特性。

2.3 binlog日志格式


binlog日志有三种格式,分别为STATMENTROW 和 MIXED

在 MySQL 5.7.7之前,默认的格式是STATEMENT,MySQL 5.7.7之后,默认值是ROW。日志格式通过binlog-format指定。

  1. STATMENT  基于SQL语句的复制(statement-based replication, SBR),每一条会修改数据的sql语句会记录到binlog中优点:不需要记录每一行的变化,减少了binlog日志量,节约了IO, 从而提高了性能; 缺点:在某些情况下会导致主从数据不一致,比如执行sysdate()、slepp()等。
  2. ROW  基于行的复制(row-based replication, RBR),不记录每条sql语句的上下文信息,仅需记录哪条数据被修改了优点:不会出现某些特定情况下的存储过程、或function、或trigger的调用和触发无法被正确复制的问题; 缺点:会产生大量的日志,尤其是alter table的时候会让日志暴涨
  3. MIXED 基于STATMENT和ROW两种模式的混合复制(mixed-based replication, MBR),一般的复制使用STATEMENT模式保存binlog,对于STATEMENT模式无法复制的操作使用ROW模式保存binlog 

 


3. redolog和binlog区别


redo log是属于innoDB层面binlog属于MySQL Server层面的,这样在数据库用别的存储引擎时可以达到一致性的要求。

  • redo log是物理日志,记录该数据页更新的内容
  • binlog 是逻辑日志,记录的是这个更新语句的原始逻辑;


redo log是循环写日志空间大小固定;binlog是追加写,是指一份写到一定大小的时候会更换下一个文件,不会覆盖。


binlog可以作为恢复数据使用,主从复制搭建,redo log作为异常宕机或者介质故障后的数据恢复使用。

redo log是InnoDB存储引擎层的日志,binlog是MySQL Server层记录的日志, 两者都是记录了某些操作的日志(不是所有)自然有些重复(但两者记录的格式不同)。

4. undo log


数据库事务四大特性中有一个是原子性,具体来说就是 原子性是指对数据库的一系列操作,要么全部成功,要么全部失败,不可能出现部分成功的情况。

实际上,原子性底层就是通过 undo log 实现的。

undo log主要记录了数据的逻辑变化,比如一条INSERT语句,对应一条DELETE的undo log,对于每个UPDATE语句,对应一条相反的UPDATE的undo log,这样在发生错误时,就能回滚到事务之前的数据状态。

undo log保存了事务发生之前的数据的一个版本,可以用于回滚同时可以提供多版本并发控制下的读(MVCC),也即非锁定读.
 

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

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

相关文章

JavaWeb开发(一)IDEA工具下载、配置、项目创建、Tomcat配置

1. IDEA工具下载、配置、项目创建、Tomcat配置 1.1. IDEA官方地址下载 官方地址下载 1.1.1. 自动补全 Settings–>Editor–>General–>Code Completion 1.1.2. 自动导包 Settings–>Editor–>General–>Auto lmport 1.1.3. 配置JDK 1.2. 创建项目 1…

RK3568 bsp 9 - USB调试记录

文章目录 1、环境介绍2、RK3568 USB资源介绍3、配置目标4、dts配置4.1、USB3.0 OTG4.2、USB2.0 Host 2 和 USB2.0 Host 3 5、kernel配置5.1、USB PHY CONFIG5.2、USB Host CONFIG5.3、USB OTG CONFIG5.4、USB外设CONFIG5.4.1、Mass Storage Class CONFIG5.4.2、USB HID CONFIG …

Servlet会话跟踪

在Servlet中,会话跟踪是通过HttpSession对象来实现的,主要有以下几种方式: 通过HttpSession对象 获取HttpSession对象:可以通过HttpServletRequest对象的getSession()方法来获取HttpSession对象。如果当前请求没有关联的会话&am…

一文讲清楚webpack和vite原理

一、前言 每次用vite创建项目秒建好,用vue-cli创建了一个项目,却有点久,那为什么用 vite 比 webpack 要快呢,这篇文章带你梳理清楚它们的原理及不同之处!文章有一点长,看完绝对有收获! 二、web…

Vue3源码解读--方向篇

vue3文档地址、GitHub项目地址: https://cn.vuejs.org/v2/api/ https://github1s.com/vuejs/vue-next/tree/3.2 二、如何本地调试vue3源码 很多时候我们都是在本地调试vue3的源码,然后沿着调用链,一步一步的去梳理vue3的源码。 把vue3项目拉到…

工业大数据分析算法实战-day20

文章目录 day20设备对象维度建模方法维度专家规则驱动的方法:AI-FIT-PM过程模型少量样本驱动的方法数据驱动的方法 软件维度 day20 今天是第20天,昨日是对第九章节行业知识沉淀中知识工程、维度模型、模式要素模型进行讲解,尤其是维度模型中…

k8s的可观测性

文章目录 1. 健康状态监测(Health Check)1.1 健康检查的原理1.2 健康检查的配置示例1.3 健康状态监测工具 2. 资源使用监控(Resource Usage Monitoring)2.1 资源使用监控的原理2.2 资源使用监控的配置示例2.3 资源使用监控工具 3.…

InstructGPT:基于人类反馈训练语言模型遵从指令的能力

大家读完觉得有意义记得关注和点赞!!! 大模型进化树,可以看到 InstructGPT 所处的年代和位置。来自 大语言模型(LLM)综述与实用指南(Amazon,2023) 目录 摘要 1 引言 …

自定义VUE指定,实现鼠标悬停显示提示面板,离开元素或面板后面板消失

参考文档:https://www.bilibili.com/opus/500023412612186477 // 自定义"v-tooltip"指令,实现鼠标悬浮显示文本 Vue.directive(tooltip, {bind(element, binding) {const tooltipText binding.value;const tooltip document.createElement(div);toolti…

如何进行年度工作回顾?

发生了什么事? 什么事情进展顺利 ? 什么事情进展不顺利? 如何适应未来? 年度回顾的定义:这是一种战略工具,能帮助人们清晰看到过去一年对业务、职业或个人生活的影响,可用于明确关键事件、找出问…

Centos 7 二进制安装时序数据库TDengine_我和国产时序数据库的第一次亲密接触

一、前言 之前在搞监控时,曾学习和测试过InfluxDB数据库,第一次接触时序数据库,也深深感受到了时序数据库的块,最近在墨天轮上看到对国产库时序数据库(Time Series Database)的介绍,特别是看了涛…

Design Compiler:两种工作模式(线负载模式和拓扑模式)

相关阅读 Design Compilerhttps://blog.csdn.net/weixin_45791458/category_12738116.html?spm1001.2014.3001.5482 Design Compiler可以以线负载模式或拓扑模式启动,必须选择其中一个模式。在拓扑模式下还可使用多模式和UPF模式:多模式允许在多种工作…

【2024年-6月-14日-开源社区openEuler实践记录】探索 test - tools:高效测试的开源宝库

开篇引言 大家好,我是 fzr123,在软件开发领域深耕多年,一直致力于探索各种提升效率的工具与技术。今天,我将为大家深入介绍一款在测试领域极具价值的开源项目——test - tools,它为开发者们提供了一系列强大的测试功能…

Java实现拍卖系统详解

一、项目背景与需求分析 随着互联网技术的飞速发展,电子商务领域不断拓展新的业务模式,在线拍卖系统应运而生并逐渐成为一种重要的商业交易方式。在当今数字化的时代,人们越来越倾向于通过网络平台进行各类交易活动,在线拍卖系统…

真的一行代码没写,使用cursor智能代码编辑器,通过问答的方式,我构建了一个微信小程序

文章目录 1 待办123 产品介绍1.1 使用说明1.2 产品亮点1.3 应用场景 2 零基础实战教程:零代码开发微信小程序2.1 微信公众号注册小程序2.2 下载安装微信开发者工具2.3 下载安装cursor2.4 使用cursor零代码构建微信小程序 3 总结 使用cursor已经有一段时间了&#xf…

element-plus在Vue3中开发相关知识

报错&#xff1a;error.mjs:20 ElementPlusError: [ElForm] model is required for resetFields to work. 原因&#xff1a;el-form使用v-model没有把内容绑定上&#xff0c;需要使用 :model 才可以校验 将&#xff1a; <el-form label-width"auto" class"…

Python爬虫实战(保姆级登网页信息爬取教程)

此blog为爬虫实战教学&#xff0c;代码已附上&#xff0c;可以复制运行。若要直接看实战代码翻到博客后半部分。 本文使用selenium库进行爬虫&#xff0c;实现爬取数据操作&#xff0c;此库是通过模仿用户的操作进行对页面的处理。了解了这个思维模式&#xff0c;可以对代码进…

PyTorch快速入门教程【小土堆】之DataLoader的使用

视频地址DataLoader的使用_哔哩哔哩_bilibili dataset数据集&#xff0c;相当于一副扑克&#xff0c;dataloader数据加载器相当于我们的手&#xff0c;选择摸几张牌&#xff0c;怎么摸牌 import torchvision# 准备的测试数据集 from torch.utils.data import DataLoader from …

# 光速上手 - JPA 原生 sql DTO 投影

前言 使用 JPA 时&#xff0c;我们一般通过 Entity 进行实体类映射&#xff0c;从数据库中查询出对象。然而&#xff0c;在实际开发中&#xff0c;有时需要自定义查询结果并将其直接映射到 DTO&#xff0c;而不是实体类。这种需求可以通过 JPA 原生 SQL 查询和 DTO 投影 来实现…

ThinkPHP 8开发环境安装

【图书介绍】《ThinkPHP 8高效构建Web应用》-CSDN博客 《ThinkPHP 8高效构建Web应用 夏磊 编程与应用开发丛书 清华大学出版社》【摘要 书评 试读】- 京东图书 1. 安装PHP8 Windows系统用户可以前往https://windows.php.net/downloads/releases/archives/下载PHP 8.0版本&am…