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 有三种格式:
-
STATEMENT(语句模式):
-
记录的是执行的 SQL 语句。优点是日志文件较小,缺点是某些非确定性的操作可能导致复制不一致。
-
记录原始SQL语句,会导致更新时间与原库不一致。 比如 update_time=now()
-
-
ROW(行模式):
-
记录的是每行数据被修改的具体信息。优点是可以确保复制的一致性,缺点是日志文件较大。
-
-
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镜像里面
最近突发奇想,想把本机的bash放到docker镜像里面,接下来看操作。 获取bash以及依赖 [rootbogon ~]# cat get_lib_info.sh #!/bin/bash# 函数:显示帮助信息 show_help() {echo "Usage: $(basename "$0") -h -f <file>…...

【数据分析】推断统计学及Python实现
各位大佬好 ,这里是阿川的博客,祝您变得更强 个人主页:在线OJ的阿川 大佬的支持和鼓励,将是我成长路上最大的动力 阿川水平有限,如有错误,欢迎大佬指正 Python 初阶 Python–语言基础与由来介绍 Python–…...

探索交互的本质:从指令到界面的演进与Linux基础指令的深入剖析
目录 1.指令 vs 界面//选读 1.1交互的需求 满足需求的第一阶段-指令 满足需求的第二阶段-界面 1.2 指令 和 界面交互 区别 2.操作系统介绍 2.1 举例说明 驱动软件层 2.2 为什么要有操作系统? 0x03 为什么要进行指令操作? 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、软件工程是什么? 为什么产生软件工程? 软件工程是做什么的? 3、定制软件和软件产品的工程比较 4 、软件产品的运行模式 5、软件产品开发时需要考虑的两个基本技术因素 6、产品愿景 7、软件产品管理 8、产品原型设计 9、小结…...

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

react学习-redux快速体验
1.redux是用于和react搭配使用的状态管理工具,类似于vue的vuex。redux可以不和任何框架绑定,独立使用 2.使用步骤 (1)定义一个reducer函数(根据当前想要做的修改返回一个新的状态) (2࿰…...

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

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

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

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

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

【面试经典150题】【双指针】392. 判断子序列
题目链接 https://leetcode.cn/problems/is-subsequence/?envTypestudy-plan-v2&envIdtop-interview-150 题解思路 首先如果s的长度大于t的长度,那么s肯定不是t的子序列如果s的长度等于t的长度,那么st的情况下s才是t的子序列如果s的长度小于t的长…...

禁用PS/Photoshop等一系列Adobe旗下软件联网外传用户数据操作
方案一: 下载火绒杀毒,在联网请求上禁用Adobe软件的联网请求,甚至还可以额外发现哪些是它要想要偷偷摸摸干的。 方案二: 最后注意: 用盗版软件只是获得了使用权!...

C语言猜输赢游戏
目录 开头游戏的程序游戏的流程图结尾 开头 大家好,我叫这是我58,现在,请你看一下下面的游戏程序。 游戏的程序 #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <Windows.h> int main() {int i 1;int ia 0…...

Rust 异步 trait 的实现困难
在 Rust 中,异步编程是使用 async/await 语法来实现的。与传统的同步编程不同,异步编程涉及到的特性较多,其中一个重要的特性是异步 trait。 异步 trait 是具有异步方法的 trait。在 Rust 中,trait 方法默认是同步的,…...

腾讯云和windows11安装frp,实现内网穿透
一、内网穿透目的 实现公网上,访问到windows上启动的web服务 二、内网穿透的环境准备 公网服务器、windows11的电脑、frp软件(需要准备两个软件,一个是安装到公网服务器上的,一个是安装到windows上的) frp下载地址下载版本 1.此版本(老版…...

Solidity智能合约事件(event)
文章目录 Solidity智能合约事件(event)什么是event事件event有什么作用日志内容位于区块链的什么地方?【重要】以太坊交易获取如何在 Solidity 中使用事件?参考 Solidity智能合约事件(event) 什么是event EVM有一个日志功能,用于将数据“写…...

第2章 Rust初体验7/8:错误处理时不关心具体错误类型的下划线:提高代码可读性:猜骰子冷热游戏
讲动人的故事,写懂人的代码 2.6.6 用as进行类型转换:显式而简洁的语法 贾克强:“大家在查看Rust代码时,可能会注意到这一句。在这里,如果我们不使用as i32,编译器会报错,因为它在u32中找不到abs()方法。这是因为prev和sum_of_two_dice都是u32类型,u32类型并不支持abs(…...

大话C语言:第24篇 预处理
1 C语言编译流程 C语言的编译流程包括: 预编译:将.c 中的头文件展开、宏展开,生成的文件是.i 文件。gcc指令:gcc -E file.c -o file.i 编译:将预处理之后的.i 文件生成 .s 汇编文件。gcc指令:gcc -S file…...

React如何配置路由
ReactTs配置路由 安装依赖 npm i react-router-dom在routers下面创建index.tsx import { RouteObject } from react-router-dom import React from react import PageA from /views/PageA import PageB from /views/PageB const routes: RouteObject[] [{path: /,element: …...

MAC使用初体验+入门
之前从来没有使用过MAC,这次拿到了一个 不得不说MAC度过适应期后用起来很舒服,续航长,触控板舒服,轻薄无比 我前期过度的时候记录的一部分快速指南,掌握如下一些电脑常识 可以做到正常使用了 基本操作 在 Mac 上使用桌…...