Mysql当中的各种log

一、MySQL日志文件类型

  • 重做日志(redo log)
  • 回滚日志(undo log)
  • 二进制日志(binlog)
  • 错误日志(errorlog)
  • 慢查询日志(slow query log)
  • 一般查询日志(general log)
  • 中继日志(relay log)

   其中,比较重要的包括 redo log 、 undo log 和 binlog。

   redo log 是重做日志,提供前滚操作;undo log 是回滚日志,提供回滚操作。

二、几种日志的对比

2-1、用途

   redo log

     确保事务的持久性。

     如果在发生故障的时间点(比如系统宕机),尚有数据未写入磁盘,在重启mysql服务的时候,根据redo log进行重做,从而达保证事务的持久性。

   undo log

     首先明确undo log绝对不是redo log的逆过程。它可以保存事务发生之前的数据的一个版本,可以用于回滚,同时可以提供多版本并发控制(MVCC)下的读。

   binlog

     1. 用于复制,在主从复制中,从库利用主库上的binlog进行重播,实现主从同步。

     2. 用于数据库的基于时间点的还原。

2-2、存储内容、格式

   redo log

     物理格式的日志,记录的是物理数据页面的修改的信息(数据库中每个页的修改),面向的是表空间、数据文件、数据页、偏移量等。

   undo log

     逻辑格式的日志,在执行undo的时候,仅仅是将数据从逻辑上恢复至事务之前的状态,而不是从物理页面上操作实现的,与redo log不同。

   binlog

     逻辑格式的日志,可以简单认为就是执行过的事务中的sql语句。

     但又不完全是sql语句这么简单,而是包括了执行的sql语句(增删改)反向的信息。比如delete操作的话,就对应着delete本身和其反向的insert;update操作的话,就对应着update执行前后的版本的信息;insert操作则对应着delete和insert本身的信息。

     因此可以基于binlog做到闪回功能。

2-3、日志生成

   redo log

     事务开始之后就产生redo log,redo log的落盘并不是随着事务的提交才写入的,而是在事务的执行过程中就开始写入。在发出事务提交指令时,先保证缓存中的redo log写入完毕,才执行提交动作。

   undo log

     事务开始之前,根据当前版本的数据生成undo log;产生undo日志的时候,同样会伴随类似于保护事务持久化机制的redo log的产生。

   binlog

     事务提交的时候,一次性将事务中的所有sql语句按照一定的格式记录到binlog中。

     这里与 redo log 相比最明显的差异就是redo log 在事务开始之后就开始逐步写入磁盘。

2-4、删除策略

   redo log

     当对应事务的数据写入完成(持久化完成)之后,redo log的使命也就完成了,日志占用的空间就可以重用(redo log的日志文件是循环写入的)。

   undo log

     事务提交之后,undo log并不会马上被被删除,而是放入待清理的链表。由purge线程判断是否由其他事务在使用undo段中表的上一个事务之前的版本信息,决定是否可以清理undo log的日志空间。

   binlog

     binlog的日志文件是追加写入,也就是文件写到一定大小以后会切换到下一个,不覆盖原有记录。不过同时binlog的默认行为是,对于非活动的日志文件,在生成时间超过expire_logs_days配置的天数之后,会被自动删除。

2-5、redo log 与 binlog 的区别

  • 作用不同:redo log是保证事务的持久性的,是事务层面的——是innodb层产生的;binlog作为还原的功能,是数据库层面的。保护数据的层次是不一样的。
  • 内容不同:redo log是物理日志,是数据页面的修改之后的物理记录;binlog是逻辑日志,可以简单认为记录的是sql语句。
  • 关于恢复数据的效率:基于物理日志的redo log恢复效率要高于语句逻辑日志的binlog。
三、两阶段提交

   redo log 保证的是数据库的 crash-safe 能力。采用的策略就是常说的“两阶段提交”。

   一条update的SQL语句是按照这样的流程来执行的:

   将数据页加载到内存 → 修改数据 → 更新数据 → 写redo log(状态为prepare) → 写binlog → 提交事务(数据写入成功后将redo log状态改为commit)

   只有当两个日志都提交成功(刷入磁盘),事务才算真正的完成。

   一旦发生系统故障(不管是宕机、断电、重启等等),都可以配套使用 redo log 与 binlog 做数据修复。

binlog状态redo log 状态对策
有记录commit事务已经正常完成
有记录prepare在binlog写完、提交事务之前发生故障。此时数据完整。恢复策略:提交事务
无记录prepare在binglog写完之前发生故障。恢复策略:回滚
无记录无记录在写redo log之前发生故障。恢复策略:回滚

补充:

1. 3种日志对比


二进制日志bin log仅在事务提交时记录,一对一,每一个事务仅包含对应事务的一个日志。

重做日志redo log记录的是物理操作日志,一对多,每个事务对应多个日志条目,并且事务的重做日志写入是并发的,并非在事务提交时写入,故其在文件中记录的顺序并非是事务开始的顺序。*T1、*T2、*T3表示的是事务提交时的日志。

2. binlog二进制 逻辑
2.1 what
逻辑日志,是由mysql上层产生,无论采用什么存储引擎都会有。

由两种格式,Statment格式、ROW格式和Mixed格式

格式    样例
Statment    
存储sql

update table set a='aa' where id=52;

ROW格式    
每行数据地 修改前后地每个字段地值mysqlbinlog解析如下

如图,包含一行数据的修改前后的值,达到误操作后进行恢复的目的

Mixed格式     

2.2 how文件写入
binlog是追加写,不会覆盖;当文件满了,就创建新的binlog文件,index递增,循环写入

3. redo log 重做日志 物理
重做日志主要用于宕机恢复,在事务提交前一定会写入到重做日志,但数据不一定持久化到了数据页。

Write-Ahead Logging:先写日志,再写磁盘,更新数据时数据行可能是没有及时修改的;这么做是为了提高性能,因为数据行比较分散,写入文件可能要重新磁盘寻址影响性能;

而重做日志是顺序读写,没有了最耗时地磁盘寻址;当事务提交后如果发生宕机,此时数据是未持久化地,重启后可以根据重做日志进行恢复,保障了事务的持久性。

what:
记录页的修改

 

日志类型有插入、删除等51种,以插入、删除为例,他们的格式如下,

插入语句记录了哪个表空间、哪一页、哪个偏移下需要存放rec body这一行。

删除语句记录表空间、哪一页、哪个偏移的行是需要删除的。

文件写入
多个重做日志文件循环写,会覆盖!因为数据也会刷磁盘,当刷完磁盘,redo 日志已经没有用了!

 

4. undo log 逻辑
主要用于事务回滚 和MVCC 多版本并发控制

undo log分为 insert和update,划分是根据插入语句的undo log提交后可以直接删除;而update类型的根据MVCC的需求不能删除,需要purge线程判断能否删除。

insert类型的undo log格式如下,记录了next下一跳日志、类型、undo no、表id和主键kv,如需回滚直接根据主键定位到数据行进行删除。

update类型是针对update语句和delete语句,除了以上 还记录了修改数据的事务id、数据的回滚指针、update vector 修改的列的原始和修改值,可以根据这个写出相反的update语句和insert语句。

 

5. update流程(记录日志时机)


两阶段提交
将 redo log 的写入拆成了两个步骤:prepare 和 commit,这就是"两阶段提交"。 

why:

由于 redo log 和 binlog 是两个独立的逻辑,如果不用两阶段提交,要么就是先写完redo log 再写 binlog,或者采用反过来的顺序。我们看看这两种方式都会存在当两者中间数据库崩溃的话,两者数据不一致。

文章知识点与官方知识档案匹配,可进一步学习相关知识
MySQL入门技能树SQL高级技巧CTE和递归查询 95743 人正在系统学习中

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

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

相关文章

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-29

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-29 目录 文章目录 计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-29目录1. Does your LLM truly unlearn? An embarrassingly simple approach to recover unlearned knowledge摘要研究背景问题…

C1.【C++ Cont】准备

目录 1.平台 2.Dev C的使用方法 1.新建项目 2.几个常用按钮 3.修改字体 3.第一个C程序:打印Hello World! 4.注 1.平台 Dev C,VS2022 2.Dev C的使用方法 1.新建项目 选择Console Application控制台应用程序,C项目 项目的后缀dev 默认下创建了一个main.cpp,cpp为c源程…

uniapp编译多端项目App、小程序,input框键盘输入后

项目场景: uniapp编译后的小程序端,app端 在一个输入框 输入消息后,点击键盘上的操作按钮之后键盘不被收起,点击其他发送按钮时,键盘也不被收起。 问题描述 在编译后的app上普通的事件绑定,tap,click在发…

pip命令行安装pytest 一直报错

其实就是切换不同镜像安装 我最终成功的是阿里云镜像 pip install --trusted-host mirrors.aliyun.com pytest 也可以用其他的 pip install -i https://pypi.org/simple pytest # 或者使用其他的镜像源 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pytest

【339】基于springboot的新能源充电系统

毕 业 设 计(论 文) 题目:新能源充电系统的设计与实现 摘 要 如今社会上各行各业,都喜欢用自己行业的专属软件工作,互联网发展到这个时候,人们已经发现离不开了互联网。新技术的产生,往往能解…

为什么 C 语言数组是从 0 开始计数的?

C 语言等大多数编程语言的数组从 0 开始而不从 1 开始,有两个原因: 第一:地址计算更方便 C 语言从 0 开始的话,array[i] 的地址就正好是: (array i) 如果是从 1 开始的话,就是 (array i - 1) 多一次计…

`map` 是 JavaScript 数组的一个高阶函数,用于对数组中的每个元素进行操作,并返回一个新的数组

文章目录 map 方法的作用语法示例 具体到你的代码完整代码片段总结 当然可以解释一下 map 方法的作用。 map 方法的作用 map 是 JavaScript 数组的一个高阶函数,用于对数组中的每个元素进行操作,并返回一个新的数组。新数组的每个元素是原数组中对应元…

代码随想录day15 二叉树(3)

文章目录 day11 栈与队列(2)栈与队列的总结 day13 二叉树(1)day14 二叉树(2)day15 二叉树(3) day11 栈与队列(2) 逆波兰表达式求值 https://leetcode.cn/problems/evaluate-reverse-polish-notation/ 逆…

计算机毕业设计Python+大模型股票预测系统 股票推荐系统 股票可视化 股票数据分析 量化交易系统 股票爬虫 股票K线图 大数据毕业设计 AI

温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! Python大模型股票预测系统 …

[山河CTF 2024] week3

一周不在家,这是补的最后一篇。后边的还有0xgame和shctf的末周。打不动了。 Crypto Approximate_n 题目分两部分,flag分两块两个RSA,第1个泄露了4个n_approxkpr的值,后边只泄露了1个。 第1部分利用以前的模板,造格…

基于SSM+VUE园艺生活植物网站JAVA|VUE|Springboot计算机毕业设计源代码+数据库+LW文档+开题报告+答辩稿+部署教+代码讲解

源代码数据库LW文档(1万字以上)开题报告答辩稿 部署教程代码讲解代码时间修改教程 一、开发工具、运行环境、开发技术 开发工具 1、操作系统:Window操作系统 2、开发工具:IntelliJ IDEA或者Eclipse 3、数据库存储&#xff1a…

C++初阶(八)--内存管理

目录 引入: 一、C中的内存布局 1.内存区域 2.示例变量存储位置说明 二、C语言中动态内存管理 三、C内存管理方式 1.new/delete操作内置类型 2.new和delete操作自定义类型 四、operator new与operator delete函数(重要点进行讲解) …

基于vue框架的的驾校预约车辆管理系统设计与实现jwoqj(程序+源码+数据库+调试部署+开发环境)系统界面在最后面

系统程序文件列表 项目功能:学员,教练员,驾校车辆,车辆信息,车辆类型,预约信息,时间段,教学课程,上报维修,维修内容,练车记录,取消信息 开题报告内容 基于Vue框架的驾校预约车辆管理系统设计与实现开题报告 一、研究背景与意义 随着驾驶培训行业的快速发展&…

JVM结构图

JVM(Java虚拟机)是Java编程语言的核心组件之一,负责将Java字节码翻译成机器码并执行。JVM由多个子系统组成,包括类加载子系统、运行时数据区、执行引擎、Java本地接口和本地方法库。 类加载子系统(Class Loading Subsy…

IDEA 打包首个java项目为jar包

新建java项目 创建一个java项目,使用Maven进行项目构建,高级配置方面主要设置了项目包版本等信息。 依照步骤生成相关的项目。 设置maven环境 从项目设置中查找maven相关配置 设置(settings)-》构建、执行、部署(B…

【ARCGIS实验】地形特征线的提取

目录 一、提取不同位置的地形剖面线 二、将DEM转化为TIN 三、进行可视分析 四、进行山脊、山谷等特征线的提取 1、正负地形提取(用于校正) 2、山脊线提取 3、山谷线的提取 4、河网的提取 5、流域的分割 五、鞍部点的提取 1、背景 2、目的 3…

达梦数据库在终端/控制台交互查询SQL语句,查询结果导出excel

达梦数据库在终端/控制台交互查询SQL语句&#xff0c;查询结果导出excel 依赖 安装JDK&#xff0c;maven引入达梦包&#xff0c;maven打包主类改成查询工具类&#xff0c;即可放到linux平台运行 <dependency><groupId>com.dameng</groupId><artifactId…

【Linux】设备树

设备树简介 我们前面介绍过平台设备驱动&#xff0c;知道硬件资源信息可以放在设备中&#xff0c;然后在驱动的probe函数中从设备中获取资源信息。但是&#xff0c;Linux3.x以后的版本引入了设备树&#xff0c;设备树用于描述一个硬件平台的硬件资源&#xff0c;一般描述那些不…

node和npm版本冲突

问题描述&#xff1a; 解决办法&#xff1a; 一、 查看自己当前的node和npm版本 node -v npm -v 二、 登录node官网地址 node官网地址 https://nodejs.org/zh-cn/about/previous-releases 查看与自己node版本兼容的是哪一版本的npm,相对应进行更新即可。 三 升级node 下载最…

笑死人不偿命的联想:大象是什么?

element&#xff08;元素&#xff09;一词&#xff0c;起源不明。但是它长得很像elephant&#xff08;大象&#xff09;一词&#xff0c;其同通部分为ele-这一结构&#xff0c;因此我们很容易将两个单词进行拆分出来&#xff1a; element n.元素 // ele ment名缀elephant n.大…