当前位置: 首页 > news >正文

MySQL的三种重要的日志

日志

Mysql有三大日志系统

  • Undo Log(回滚日志):记录修改前的数据,用于事务回滚和 MVCC(多版本并发控制)。

  • Redo Log(重做日志):记录数据变更,用于崩溃恢复,确保持久性。

  • Binlog(备份日志):记录事务操作日志,用于主从复制和灾难恢复。

Redo Log

Redo Log 记录的是物理日志,也就是磁盘数据页的修改(Redo Log 记录了哪些数据被修改,以及修改前后的数据内容。包括被修改的数据页或块的位置信息)

作用:用来保证服务崩溃后,仍能把事务中变更的数据持久化到磁盘上

背景:当数据库对数据做修改时,需要把数据页从磁盘读到buffer pool中,然后在buffer pool中进行修改,那么这个时候buffer pool中的数据页就与磁盘上的数据页内容不一致,称buffer pool的数据页为脏数据,如果这个时候发生非正常的DB服务重启,那么这些数据还在内存,并没有同步到磁盘上,也就是发生数据丢失,那么这个时候使用redo log,在buffer pool的数据页变更结束后,就可以相应修改记录到这个文件,那么当DB服务发生崩溃宕机时,进行恢复DB时,可以根据文件的记录内容,重新持久化刷新到磁盘数据(redo log ,用于记录数据修改后的记录,顺序记录,主要用于数据的持久化操作。)、

 

组成

  • redo log buffer日志缓存

重做日志缓存存在于内存中,容易发生丢失,先缓存数据,再一次性存入磁盘。

  • redo log file日志文件

存在于磁盘中,不容易发生丢失

redo log buffer是在内存中的,写入buffer后,并不会立即持久化到Redo log file,需要等待操作系统调用fsync操作(具体什么时候使用innodb_flush_log_at_trx_commit 参数配置)

参数值含义
0(延迟写)提交事务后,不会立即刷到OS Buffer中,而是等一秒后刷新到OS Buffer并调用fsync()写入Redo Log FIle,可能会丢失一秒钟的数据。
1(实时写每次提交事务,都会刷新到OS Buffer并调用fsync()写到Redo Log FIle,性能较差
2(延迟刷新)每次提交事务只刷新到OS Buffer,一秒后再调用fsync()写入Redo Log FIle

 

 

Undo Log

Undo Log回滚日志记录的是逻辑日志,也就是sql语句(比如当我们执行一条insert语句,Undo Log记录一条相反的delete语句--但它并不是简单地存储原始的SQL语句,而是存储相应的逆操作及相关的数据状态。这种设计使得回滚操作更直接和高效。)

作用

  • 回滚事务:当事务需要回滚时,数据库系统使用Undo Log来撤销事务已经执行的修改,恢复到事务开始之前的数据状态。

  • MVCC多版本控制:Undo Log在实现多版本并发控制(MVCC)中也起到关键作用。通过记录数据的历史版本,系统可以提供一致的读视图,支持并发事务的读取和修改。

组成:也是有undo buffer和undo logo日志组成

原理:如我们执行下面一条删除语句:

 delete from user where id = 1;

那么此时undo log就会记录一条对应的insert语句(反向),以保证事务回滚时,将数据还原回去。

Undo log存储由InnoDB的存储引擎实现,数据保存再innoDB的数据文件中,再存储引擎中,undo log是采用分段的方式进行存储的。rollback segment称为回滚段。在MySQL5.5之后,可以支持128个rollback segment,分别从resg slot0 - resg slot127,每一个resg slot,也就是每一个回滚段,内部由1024个undo segment 组成,即总共可以记录128 * 1024个undo操作。

undo log日志存放的信息如下

 

  • undo log日志里面不仅存放着数据更新前的记录,还记录着RowID、事务ID、回滚指针,其中事务ID每次递增,回滚指针第一次如果是insert语句的话,回滚指针为null,第二次update之后undo log的回滚指针就会指向刚刚那一条undo log日志,以此类推形成了一条undo log的回滚链,便于找到该记录的历史版本

  • 在事务提交之前会将数据备份到undo buffer,然后由undo buffer持久化到磁盘中的undo log文件中,此时undo log保存了之前未提交之前的操作日志,接着将操作的数据,持久化到数据文件中(更新数据前记录undo log)

例如:假设有A、B两个数据,值分别为1,2。

A. 事务开始
B. 记录A=1到undo log中
C. 修改A=3
D. 记录B=2到undo log中
E. 修改B=4
F. 将undo log写到磁盘 -------undo log持久化
G. 将数据写到磁盘 -------数据持久化
H. 事务提交 -------提交事务

 

Bin Log

Binlog 是 MySQL 中用于记录数据库修改操作的日志文件。binlog记录的是逻辑日志,即原始的sql语句,是mysql自带的。是mysql数据库中的二进制日志文件,用于记录数据库的所有更改操作。他以二进制的形式存储,包含了对数据库执行所有修改操作的详细信息,如插入、更新、删除等。BInlog是Mysql事务日志的一部分,与Redo log一起,确保数据库的一致性,持久性,以及提供一些关键的数据库管理功能。

作用

用于数据备份、主从同步、数据恢复

  • 主从复制:在主从复制中,主服务器将所有的更改记录到Binlog中,而从服务器通过读取主服务器的Binlog并执行相同的更改来保持数据同步。这实现了数据的复制和冗余,提高了系统的可用性和可靠性。

  • 数据库备份:Binlog也是数据库备份的一部分。通过备份Binlog,可以实现增量备份,只备份自上次完整备份以来发生的变更,从而减少备份的时间和存储成本。

  • 数据恢复:在数据库崩溃或数据丢失时,可以使用 Binlog 进行数据恢复。通过重放 Binlog 中记录的所有操作,可以将数据库恢复到某个特定时间点。

组成

事件头(Event Header)

  • 包含事件的时间戳、类型、服务器ID等信息。

事件数据(Event Data)

  • 具体记录了对数据库表的修改操作。根据事件类型不同,事件数据也有所不同,比如可能是表结构变更、行数据修改等。

文件格式描述符(File Format Descriptor)

  • 描述了 Binlog 文件的格式信息,通常在 Binlog 文件的开头。

Binlog 的类型

MySQL 的 Binlog 有三种格式:

  1. STATEMENT(语句模式)

    • 记录的是执行的 SQL 语句。优点是日志文件较小,缺点是某些非确定性的操作可能导致复制不一致。

    • 记录原始SQL语句,会导致更新时间与原库不一致。 比如 update_time=now()

  2. ROW(行模式)

    • 记录的是每行数据被修改的具体信息。优点是可以确保复制的一致性,缺点是日志文件较大。

  3. MIXED(混合模式)

    • 结合了语句模式和行模式的优点。MySQL 自动选择最合适的格式记录日志。

    • Statement和Row的混合模式,默认采用Statement模式,涉及日期、函数相关的时候采用Row模式,既减少了数据量,又保证了数据一致性。

    这时,MySQL并不会立即刷盘,而是依据sync_binlog参数决定刷盘的频率和时机。

    参数值含义
    0(延迟写)每次提交事务都不会刷盘,由系统自己决定什么时候刷盘,可能会丢失数据。
    1(实时写)每次提交事务,都会刷盘,性能较差。
    N(延迟写)提交N个事务后,才会刷盘。

事务提交前刷盘过程

事务开始

  • 执行一组数据库操作,如插入、更新、删除等。

写入 Undo Log 缓冲区

  • 在执行修改操作之前,首先将修改前的记录写入 Undo Log 缓冲区。这一步骤确保了即使在事务失败或回滚时,可以恢复到修改前的状态。

写入Redo Log缓冲区

  • 同时,修改操作的Redo Log记录也写入内存中的Redo Log缓冲区。

写入 Binlog 缓冲区

  • 在执行这些操作的过程中,MySQL 会将这些操作记录在 Binlog 缓冲区中。

准备提交

  • 当事务准备提交时,MySQL 会将 Binlog 缓冲区的内容写入磁盘上的 Binlog 文件。这一步是为了确保即使在事务提交之后发生系统崩溃,事务的操作记录仍然可以从 Binlog 中恢复。

  • 当事务准备提交时,MySQL会将Binlog缓冲区的内容写入到磁盘上的Binlog文件中。

    这时,MySQL并不会立即刷盘,而是依据sync_binlog参数决定刷盘的频率和时机。

写入 Redo Log

  • 将事务的变更记录写入到 InnoDB 的 Redo Log 中。这也是在事务提交之前进行的,以确保数据的持久性。

  • 根据 innodb_flush_log_at_trx_commit 参数的设置,决定是否立即将 Redo Log 刷盘到磁盘。

写入 Undo Log 文件

  • 在事务准备提交时,MySQL 会将 Undo Log 缓冲区的内容写入到磁盘上的 Undo Log 文件中,以确保事务的回滚信息持久化。

然后提交事务

相关文章:

MySQL的三种重要的日志

日志 Mysql有三大日志系统 Undo Log(回滚日志):记录修改前的数据,用于事务回滚和 MVCC(多版本并发控制)。 Redo Log(重做日志):记录数据变更,用于崩溃恢复&…...

神经网络学习2

张量(Tensor)是深度学习和科学计算中的基本数据结构,用于表示多维数组。张量可以看作是一个更广义的概念,涵盖了标量、向量、矩阵以及更高维度的数据结构。具体来说,张量的维度可以是以下几种形式: 标量&am…...

Spring Boot整合Redis通过Zset数据类型+定时任务实现延迟队列

😄 19年之后由于某些原因断更了三年,23年重新扬帆起航,推出更多优质博文,希望大家多多支持~ 🌷 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志 🎐 个人CSND主页——Mi…...

Android入门第69天-AndroidStudio中的Gradle使用国内镜像最强教程

背景 AndroidStudio默认连接的是dl.google的gadle仓库。 每次重新build时: 下载速度慢;等待了半天总时build faild;build到一半connection timeout;即使使用了魔法也难以一次build好;这严重影响了我们的学习、开发效率。 当前网络上的使用国内镜像的教程不全 网上的教程…...

深入浅出 Qt 中 QListView 的设计思想,并掌握大规模、高性能列表的实现方法

在大规模列表控件的显示需求中,必须解决2个问题才能获得较好的性能: 第一就是数据存在哪里, 避免出现数据的副本。第二就是如何展示Item,如何复用或避免创建大量的Item控件。 在QListView体系里,QAbstractListModel解…...

课设--学生成绩管理系统

欢迎来到 Papicatch的博客 文章目录 🍉技术核心 🍉引言 🍈标识 🍈背景 🍈项目概述 🍈 文档概述 🍉可行性分析的前提 🍈项目的要求 🍈项目的目标 🍈…...

MySQL性能分析

一、查看执行频率 sql执行频率,执行下述指令可以看到select,update,delete等操作的次数 show global status like Com_______; 具体我们在终端登录mysql看下,使用下述命令登录mysql,并输入命令 mysql -u 用户名 -p 上述查询,删…...

为什么要学习Flink系统管理及优化课程?

Flink系统是一种流式处理框架,能够高效地处理大规模数据流。然而,要确保Flink系统的正常运行,就需要进行系统管理和优化。系统管理是指对Flink集群的监控、调度和维护,而系统优化则是指通过调整参数和优化算法,提高Fli…...

把本机的bash构建到docker镜像里面

最近突发奇想&#xff0c;想把本机的bash放到docker镜像里面&#xff0c;接下来看操作。 获取bash以及依赖 [rootbogon ~]# cat get_lib_info.sh #!/bin/bash# 函数&#xff1a;显示帮助信息 show_help() {echo "Usage: $(basename "$0") -h -f <file>…...

【数据分析】推断统计学及Python实现

各位大佬好 &#xff0c;这里是阿川的博客&#xff0c;祝您变得更强 个人主页&#xff1a;在线OJ的阿川 大佬的支持和鼓励&#xff0c;将是我成长路上最大的动力 阿川水平有限&#xff0c;如有错误&#xff0c;欢迎大佬指正 Python 初阶 Python–语言基础与由来介绍 Python–…...

探索交互的本质:从指令到界面的演进与Linux基础指令的深入剖析

目录 1.指令 vs 界面//选读 1.1交互的需求 满足需求的第一阶段-指令 满足需求的第二阶段-界面 1.2 指令 和 界面交互 区别 2.操作系统介绍 2.1 举例说明 驱动软件层 2.2 为什么要有操作系统&#xff1f; 0x03 为什么要进行指令操作&#xff1f; 3.Linux基本指令 l…...

uniapp vue分享功能集成

分享必须通过button设置open-type"share"拉起 <view class"img horizontal center" style"margin-right: 20rpx;"><image class"img" :src"src" click"onTapClick(xxx)" style"z-index: 1;" …...

软件工程实务:软件产品

目录 1、软件产品的基本概念 2、软件工程是什么&#xff1f; 为什么产生软件工程? 软件工程是做什么的? 3、定制软件和软件产品的工程比较 4 、软件产品的运行模式 5、软件产品开发时需要考虑的两个基本技术因素 6、产品愿景 7、软件产品管理 8、产品原型设计 9、小结…...

带侧边栏布局:带导航的网页

目录 任务描述 相关知识 HTML(HyperText Markup Language) CSS&#xff08;Cascading Style Sheets&#xff09;&#xff1a; 编程要求 任务描述 在本关中&#xff0c;你的任务是创建一个带侧边栏和导航的网页布局。这种布局通常用于网站或应用程序&#xff0c;其中侧边栏…...

react学习-redux快速体验

1.redux是用于和react搭配使用的状态管理工具&#xff0c;类似于vue的vuex。redux可以不和任何框架绑定&#xff0c;独立使用 2.使用步骤 &#xff08;1&#xff09;定义一个reducer函数&#xff08;根据当前想要做的修改返回一个新的状态&#xff09; &#xff08;2&#xff0…...

基于flask的网站如何使用https加密通信-问题记录

文章目录 项目场景&#xff1a;问题1问题描述原因分析解决步骤解决方案 问题2问题描述原因分析解决方案 参考文章 项目场景&#xff1a; 项目场景&#xff1a;基于flask的网站使用https加密通信一文中遇到的问题记录 问题1 问题描述 使用下面的命令生成自签名的SSL/TLS证书和…...

记C#优化接口速度过程

前提摘要 首先这个项目是接手的前一任先写的项目&#xff0c;接手后&#xff0c;要求对项目一些速度相对较慢的接口进行优化&#xff0c;到第一个速度比较慢的接口后&#xff0c;发现单接口耗时4-8秒&#xff0c;是的&#xff0c;请求同一个接口&#xff0c;在参数不变的情况下…...

windows环境如何运行python/java后台服务器进程而不显示控制台窗口

1.通常我们在windows环境下使用Java或Python语言编写服务器程序&#xff0c;都希望他在后台运行&#xff0c;不要显示黑乎乎的控制台窗口&#xff1a; 2.有人写了一个bat文件: cd /d D:\lottery\server && python .\main.py 放到了开机自启动里&#xff0c;可是开机的…...

记周末百度云防御CC攻击事件

今天一早&#xff0c;收到百度智能云短信提醒&#xff0c;一位客户的网站遭遇了CC攻击。 主机吧赶紧登陆客户网站查看&#xff0c;是否正常&#xff0c;看是否需要通知客户。 结果打开正常&#xff0c;看情况并没什么影响&#xff0c;那就等攻击结果了再看吧。 下午的时候&am…...

vue中v-bind控制class和style

当使用v-bind指令控制class和style时&#xff0c;可以通过动态绑定的方式根据不同的条件来添加或移除class&#xff0c;以及改变元素的样式。 1. 控制class 通过v-bind:class可以动态绑定class属性。可以使用对象语法、数组语法或者计算属性来实现。 对象语法&#xff1a;使用…...

椭圆曲线密码学(ECC)

一、ECC算法概述 椭圆曲线密码学&#xff08;Elliptic Curve Cryptography&#xff09;是基于椭圆曲线数学理论的公钥密码系统&#xff0c;由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA&#xff0c;ECC在相同安全强度下密钥更短&#xff08;256位ECC ≈ 3072位RSA…...

Qt Widget类解析与代码注释

#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码&#xff0c;写上注释 当然可以&#xff01;这段代码是 Qt …...

vue3+vite项目中使用.env文件环境变量方法

vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量&#xff0c;这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

【Linux】Linux 系统默认的目录及作用说明

博主介绍&#xff1a;✌全网粉丝23W&#xff0c;CSDN博客专家、Java领域优质创作者&#xff0c;掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围&#xff1a;SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...

深入浅出Diffusion模型:从原理到实践的全方位教程

I. 引言&#xff1a;生成式AI的黎明 – Diffusion模型是什么&#xff1f; 近年来&#xff0c;生成式人工智能&#xff08;Generative AI&#xff09;领域取得了爆炸性的进展&#xff0c;模型能够根据简单的文本提示创作出逼真的图像、连贯的文本&#xff0c;乃至更多令人惊叹的…...

es6+和css3新增的特性有哪些

一&#xff1a;ECMAScript 新特性&#xff08;ES6&#xff09; ES6 (2015) - 革命性更新 1&#xff0c;记住的方法&#xff0c;从一个方法里面用到了哪些技术 1&#xff0c;let /const块级作用域声明2&#xff0c;**默认参数**&#xff1a;函数参数可以设置默认值。3&#x…...

精益数据分析(98/126):电商转化率优化与网站性能的底层逻辑

精益数据分析&#xff08;98/126&#xff09;&#xff1a;电商转化率优化与网站性能的底层逻辑 在电子商务领域&#xff0c;转化率与网站性能是决定商业成败的核心指标。今天&#xff0c;我们将深入解析不同类型电商平台的转化率基准&#xff0c;探讨页面加载速度对用户行为的…...

Element-Plus:popconfirm与tooltip一起使用不生效?

你们好&#xff0c;我是金金金。 场景 我正在使用Element-plus组件库当中的el-popconfirm和el-tooltip&#xff0c;产品要求是两个需要结合一起使用&#xff0c;也就是鼠标悬浮上去有提示文字&#xff0c;并且点击之后需要出现气泡确认框 代码 <el-popconfirm title"是…...

数据挖掘是什么?数据挖掘技术有哪些?

目录 一、数据挖掘是什么 二、常见的数据挖掘技术 1. 关联规则挖掘 2. 分类算法 3. 聚类分析 4. 回归分析 三、数据挖掘的应用领域 1. 商业领域 2. 医疗领域 3. 金融领域 4. 其他领域 四、数据挖掘面临的挑战和未来趋势 1. 面临的挑战 2. 未来趋势 五、总结 数据…...

Centos 7 服务器部署多网站

一、准备工作 安装 Apache bash sudo yum install httpd -y sudo systemctl start httpd sudo systemctl enable httpd创建网站目录 假设部署 2 个网站&#xff0c;目录结构如下&#xff1a; bash sudo mkdir -p /var/www/site1/html sudo mkdir -p /var/www/site2/html添加测试…...