MySQL-事务日志

事务的隔离性由 锁机制 实现
事务的原子性、一致性、隔离性 由事务的 redo日志 和 undo 日志来保证
  • redo log 称为 重做日志,提供再写入操作,恢复提交事务修改的页操作,用来保证事务的持久性。
  • undo log 称为 回滚日志,回滚行记录到某个特定的版本,用来保证事务的原子性、一致性。

1、redo日志

  • InnoDB存储引擎是以页为单位来管理存储空间的。在正真访问页之前,需要把磁盘上的页缓存到内存中的 buffer pool 后才能访问。所有的变更都必须 先更新缓冲池 中的数据,然后缓冲池中的 脏页 会以一定频率被刷新到磁盘(checkpoint机制)。

1.1、redo日志的好处

  • 降低了刷新磁盘的频率
  • 占用的空间非常小

存储表空间ID、页号、偏移量以及需要更新的值,所需的存储空间是很小的,刷新磁盘块

1.2、redo日志的特点

  • 是顺序写入磁盘的

在事务执行过程中,每执行一条语句就可能产生若干条redo日志,这些日志是按照 产生的顺序写入磁盘的,使用顺序IO效率比随机IO快

  • 事务执行过程中,redo log 不断记录

redo log 和 bin log 的区别在于 redo log 是存储引擎产生的,而bin log 是数据库层产生的。
比如一个事务对表做大量行的记录插入操作,在这个过程中,一致不断往redo log 顺序记录,而bin log 不会记录,直到事务提交,才会写入到bin log文件中

1.3、redo的组成

  • 重做日志的缓冲(redo log buffer),保存在内存中,是易丢失的。 参数设置 :innodb_log_buffer_size 默认16M,最大值是4096M 最小值为1M
mysql> show variables like 'innodb_log_buffer_size';
+------------------------+----------+
| Variable_name          | Value    |
+------------------------+----------+
| innodb_log_buffer_size | 16777216 |
+------------------------+----------+
1 row in set (3.29 sec)


在服务器启动时就向操作系统申请一大片 redo log buffer 的连续内存空间,即redo日志缓冲区。这片内存空间被划分为若干个连续的 redo log block。一个 redo log block 占用 512字节大小。

在这里插入图片描述

  • 重做日志文件(redo log file),保存在硬盘中,是持久的

1.4、redo的执行整体流程

  • 以更新事务举例,如下所示
    在这里插入图片描述

①:先将原始数据从磁盘读入内存,修改数据的内存拷贝
②:生成一条重做日志并写入redo log buffer,记录数据被修改后的值
③:当事务commit时,将redo log buffer 中的内容刷新到 redo log file,对redo log file 采用追加写的方式
④:定期将内存中修改的数据刷新到磁盘中

write-ahead log(预先日志持久化):在持久化一个数据页之前先将内存中相应的日志页持久化

1.5、redo log 刷盘策略

  • 参数设置: innodb_flush_log_at_trx_commit ,支持以下三种策略:
    • 设置为0:表示每次事务提交时不进行刷盘操作。(系统默认master thread 每隔1s进行一次重做日志的同步)
    • 设置为1:表示每次事务提交时都将进行同步,刷盘操作(默认值)
    • 设置为2:表示每次事务提交时都只把redo log buffer 内容写入page cache,不进行同步。
mysql> show variables like 'innodb_flush_log_at_trx_commit';
+--------------------------------+-------+
| Variable_name                  | Value |
+--------------------------------+-------+
| innodb_flush_log_at_trx_commit | 1     |
+--------------------------------+-------+
1 row in set (1.64 sec)

1.6、写入 redo log buffer 过程

1.6.1、Mini-Transaction

MySQL对底层页面一次原子性访问的过程称为一个 Mini-Transaction,简称 mtr。
例如:向某个索引对应的B+树中插入一条记录的过程就是一个Mini-Transaction。一个所谓的mtr 可以包含一组redo日志,在进行崩溃恢复时这一组redo日志作为一个不可分割的整体。

  • 一个事务可以包含若干条语句,每一条语句其实由若干个mtr组成,每个mtr又可以包含若干条redo日志。如下图所示
    在这里插入图片描述
1.6.2、日志写入log buffer

向log buffer 中写入redo日志的过程是顺序的,也就是先往前边的block中写,当该block的空闲空间用完之后再往下一个block中写。当往log buffer中写入redo 日志时,设计者提供一了一个 buf_free的全局变量,该变量指明后续写入的redo日志应该写入到log_buffer中的哪个位置。如下图所示

在这里插入图片描述

  • 一个mtr执行过程中可能产生若干条redo日志,这些redo日志是一个不可分割的组。并不是没生成一条redo日志就将其插入到log buffer 中,而是每个mtr运行过程中产生的日志先暂时存放到一个位置,当该mtr结束的时候将过程中产生的一组redo日志全部复制到 log buffer中。
1.6.3、redo log block的结构图
  • 一个redo log block是由 日志头(12字节)、日志体(492字节)、日志尾(8字节)组成。

1.7、redo log file

1.7.1、相关参数设置
  • innodb_log_group_home_dir:指定redo log 文件组所在的路径,默认值为 ./ ,表示再数据库的数据目录下。MySQL的默认数据目录(var/lib/mysql)下默认有两个名为ib_logfile0 和 ib_logfile1的文件,log buffer 中的日志默认情况下就是刷新到这两个磁盘文件中。此redo日志文件位置还可以修改。
mysql> show variables like 'innodb_log_group_home_dir';
+---------------------------+-------+
| Variable_name             | Value |
+---------------------------+-------+
| innodb_log_group_home_dir | ./    |
+---------------------------+-------+
1 row in set (3.70 sec)

  • innodb_log_files_in_group:指明redo log file 的个数,默认 2个,最大100个。
mysql> show variables like 'innodb_log_files_in_group';
+---------------------------+-------+
| Variable_name             | Value |
+---------------------------+-------+
| innodb_log_files_in_group | 2     |
+---------------------------+-------+
1 row in set (0.00 sec)
  • innodb_flush_log_at_tx_commit : 控制redo log 刷新到磁盘的策略,默认为 1
mysql> show variables like 'innodb_flush_log_at_trx_commit';
+--------------------------------+-------+
| Variable_name                  | Value |
+--------------------------------+-------+
| innodb_flush_log_at_trx_commit | 1     |
+--------------------------------+-------+
1 row in set (1.64 sec)
  • innodb_log_file_size:单个redo log 文件设置大小,默认值为48M。最大值为512G(指整个redo log 系列文件之和)。
mysql> show variables like 'innodb_log_file_size';
+----------------------+----------+
| Variable_name        | Value    |
+----------------------+----------+
| innodb_log_file_size | 50331648 |
+----------------------+----------+
1 row in set (0.00 sec)
1.7.2、日志文件组
  • redo日志文件以日志文件组的形式出现。文件以ib_logfile[正整数]的形式命名,每个redo日志文件都是一样大小。
  • redo日志写入顺序依次执行,当最后一个文件写满后会从第一个接续写。

在这里插入图片描述

1.7.3、checkpoint

在整个日志文件组中还有两个重要的属性,分别时 write pos 、checkpoint

  • write pos 是记录当前位置,一边写一边后移
  • checkpoint 是当前要擦除的位置,也是往后推移
  • 每次刷盘 redo log 记录到日志文件组中,write pos 位置就会后移更新。每次MySQL加载日志文件组恢复数据时,会清空加载过的 redo log 记录,并把checkpoint后移更新。write pos 和checkpoint 之间还空闲的部分可以写入新的redo log 记录。
    在这里插入图片描述

2、undo日志

  • undo log是事务的原子性保证。在事务中更新数据 的前置操作其实就是要先写入一个 undo log

2.1、undo log 的理解

  • 事务需要保证原子性,也就是事务的操作要么全部完成,要么都不做,但有时候事务执行到一半会出现以下情况:
    • 事务执行过程中会遇到各种错误,如:服务器本身错误,操作系统错误等
    • 在事务执行过程中手动rollback操作结束当前事务的执行

2.2、undo log 的作用

  • 回滚数据
  • 并发版本控制(MVCC)

2.3、undo 的存储结构

2.3.1、回滚段与undo页
  • innodb对undo log管理采用段的方式 即回滚段(rollback segment)。每个回滚段记录了 1024个undo log segment,而每个undo log segment段中进行undo页的申请。

    • 在innodb1.1版本之前,只有一个rollback segment,因此支持同时在线的事务限制为1024.
    • innodb1.1开始支持最大128个 rollback segment,故其支持同时在线的事务限制提高到了 128*1024。
  • 通过查询参数 innodb_rollback_segments

mysql> show variables like 'innodb_rollback_segments';
+--------------------------+-------+
| Variable_name            | Value |
+--------------------------+-------+
| innodb_rollback_segments | 128   |
+--------------------------+-------+
1 row in set (0.01 sec)
  • innodb_undo_directory:设置rollback segment 文件所在路径。
mysql> show variables like 'innodb_undo_directory';
+-----------------------+-------+
| Variable_name         | Value |
+-----------------------+-------+
| innodb_undo_directory | ./    |
+-----------------------+-------+
1 row in set (0.13 sec)
  • innodb_undo_tablespaces: 设置构成rollback segment文件的数量,这样rollback segment 可以较为平均的分布在多个文件中。设置该参数后会在路径innodb_undo_directory看到undo为前缀的文件,该文件就表示rollback segment文件。
mysql> show variables like 'innodb_undo_tablespaces';
+-------------------------+-------+
| Variable_name           | Value |
+-------------------------+-------+
| innodb_undo_tablespaces | 2     |
+-------------------------+-------+
1 row in set (0.12 sec)

undo页的重用

  • 当我们开启一个事务需要写入undo log的时候,就得先去undo log segment中找到一个空闲的空间,当有空位的时候就去申请undo页,在这个申请到的undo页中进行undo log 的写入。
  • undo log 在commit后会被放到一个链表中,然后判断undo页的使用空间是否小于3/4。如果小于则表示当前的undo页可以被重用,不会被回收掉,其他事务的undo log 可以记录在当前undo页的后面。
  • 由于undo log 是 离散的 ,在清理对应磁盘空间时,效率不高。
2.3.2、回滚段与事务
  • 每个事务只会使用一个回滚段,一个回滚段在同一时刻可能会服务于多个事务
  • 当一个事务开始的时候,会制定一个回滚段,在事务进行过程中,当数据被修改时,原始的数据会被复制到回滚段。
  • 在回滚段中,事务会不断填充盘区,直到事务结束或所有的空间被用完。如果当前的盘区不够用,事务会在段中请求下一个盘区,如果占用盘区被用完,事务会覆盖最初盘区或者在回滚段允许的情况下拓展新的盘区来使用。
  • 回滚段存在于 undo表空间中,在数据库中可以存在多个表空间,但同一时刻只能使用一个undo表空间。
  • 当事务提交时,innodb存储引擎会做以下两件事情:
    • 将undo log 放入列表中以供之后的purge操作
    • 判断undo log 所在的页是否可以重用,若可以分配给下一个事务使用
2.3.3、回滚段中数据分类
  • 未提交的回滚数据:该数据所关联的事务并未提交,用于实现读一致性,所以数据不能被其他事务覆盖
  • 已经提交但未过期的回滚数据:该数据关联的事务已经提交,但是仍收到 undo retention参数的保持时间的影响。
  • 已经提交并过期的回滚:事务已经提交,而且数据保存时间已经超过 undo retention参数指定的时间,属于已经过期的数据。当回滚段满后,会优先覆盖事务已经提交并过期的数据。

2.4、undo的类型

  • insert undo log:指在inset操作中产生的undo log。因为insert操作的记录,只对事务本省可见,对其他事务不可见,故该 undo log 可以在事务提交后直接删除,不需要进行purge操作。
  • update undo log:指对delete和update操作产生发的undo log。该undo log 可能需要提供MVCC机制,因此不能在事务提交时就进行删除。提交时放入undo log 链表,等待purge线程进行最后的删除。

purge线程:
主要作用就是清理undo页和清除page里面带有delete_bit标识的数据行。在innodb中,事务中的delete操作实际上并不是真正的删除掉数据行,而是一种delete mark操作,在记录上标识delete_bit,而不删除记录,是一种“假删除”,知识做了相关标记,真正的删除工作需要后台的purge线程去完成。

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

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

相关文章

揭秘c语言作用域

前言 欢迎来到我的博客 个人主页:北岭敲键盘的荒漠猫-CSDN博客 本文主要整理c语言中 与作用域相关的知识点 本文适合对象:无编程基础,因为解释的比较多,所以不适合有基础的人快速掌握了 作用域描述 其实就是起作用的区域。比如个变量,函数…

System-Verilog 实现DE2-115倒车雷达模拟

System-Verilog 实现DE2-115倒车雷达模拟 引言: 随着科技的不断进步,汽车安全技术也日益成为人们关注的焦点。在众多汽车安全辅助系统中,倒车雷达以其实用性和高效性脱颖而出,成为现代汽车不可或缺的一部分。倒车雷达系统利用超声…

轻松拿捏C语言——【内存函数】

🥰欢迎关注 轻松拿捏C语言系列,来和 小哇 一起进步!✊ 🎉创作不易,请多多支持🎉 🌈感谢大家的阅读、点赞、收藏和关注💕 🌹如有问题,欢迎指正~~ 目录&#x1…

简单说说我对集成学习算法的一点理解

概要 集成学习(Ensemble Learning)是一种机器学习技术框架,它通过构建并结合多个学习器(也称为个体学习器或基学习器)来完成学习任务。 集成学习旨在通过组合多个基学习器的预测结果来提高整体模型的性能。每个基学习…

《mysql轻松学习·二》

1、创建数据表 contacts:数据表名 auto_increament:自动增长 primary key:主键 engineInnoDB default charsetutf8; 默认字符集utf8,不写就默认utf8 对数据表的操作: alter table 数据表名 add sex varchar(1); //添…

MySQL 一条SQL查询/更新语句是如何执行的?

MySQL 一条SQL查询语句是如何执行的? 1 连接器 首先客户端需要先跟服务端进行连接 2 查询缓存 MySQL 5.7 以及之前的版本会查询MySQL缓存,存储是键值对形式的 分析器 对SQL进行词法分析【会生成词法树】以及语法分析 词法分析: 主要负…

安卓ANR检测、分析、优化面面谈

前言 一个引发讨论的楔子,以下三种现象有什么区别: App停止运行App暂无响应App闪退 答案: 产生原因不同:停止运行是UNCheckExceptionError暂无响应是ANRDialog闪退是CheckExceptionError 本文讨论的主题是ANR的定义、分类、复现…

CISCN 2023 初赛 被加密的生产流量

题目附件给了 modbus.pcap 存在多个协议 但是这道题多半是 考 modbus 会发现 每次的 Query 末尾的两个字符 存在规律 猜测是base家族 可以尝试提取流量中的数据 其中Word Count字段中的22871 是10进制转16进制在转ascii字符串 先提取 过滤器判断字段 tshark -r modbus.pcap …

大学校园广播“录编播”与IP校园公共广播系统技术方案

一、项目概述 1、校园IP网络广播系统概述 大学校园广播系统是学校整个弱电系统中的子系统,它是每个学校不可缺少的基础设施之一,在传递校园文化、传播校园新闻资讯方面发挥着重要的作用。近几年来,虽然视频技术和网络技术在飞速发展&#xf…

沟通程序化(1):跟着鬼谷子学沟通—“飞箝”之术

沟通的基础需要倾听,但如果对方听不进你的话,即便你说的再有道理,对方也很难入心。让我们看看鬼谷子的“飞箝”之术能给我们带来什么样的启发吧! “飞箝”之术,源自中国古代兵法家、纵横家鼻祖鬼谷子的智慧&#xff0…

基于分步傅立叶数值算法的一维非线性薛定谔方程求解matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于分步傅立叶数值算法的一维非线性薛定谔方程求解matlab仿真. 2.测试软件版本以及运行结果展示 MATLAB2022A版本运行 3.核心程序 ........................…

appium元素定位工具_uiautomatorviewer.bat

特点: uiautomatorviewer是android-sdk自带的元素定位工具uiautomatorviewer只能用于安卓系统;它是通过截屏分析XML布局文件方式,来提供控件信息的查看服务 uiautomatorviewer.bat 基本使用 路径:这个工具是Android SDK中自带&…

【C++】C++11新特性:新的类功能、可变参数模板、STL容器中的empalce相关接口函数、lambda表达式、包装器(function、bind)

目录 一、新的类功能 1.1 移动构造函数和移动赋值运算符重载 1.2 强制生成默认函数的关键字default 1.3 禁止生成默认函数的关键字delete 1.4 其它的类功能 二、可变参数模板 三、STL容器中的empalce相关接口函数 四、lambda表达式 4.1 lambda的引入 4.2 lambda表达式…

Ollama教程,本地部署大模型Ollama,docker安装方法,仅供学习使用

不可商用!!仅仅提供学习使用! 先上视频教学: Ollama教程,本地部署大模型Ollama,docker安装方法,仅供学习使用! 资料获取 : Ollama下载包和安装文档在这里&#xff1…

从零到一的程序猿-day2-yoloV4训练及免环境易语言调用

简介 本项目功能介绍:针对4位英文数字随机组合的验证码抽象图片进行分类识别,识别结果为验证码内容 训练 没有难度,手动标注,样本为150张,首先识别出图片中每个英数的位置,再由分类器进行标注识别&#x…

latex bib引参考文献

1.bib内容 2.sn-mathphys-num是官方的参考文献格式 3.不用导cite包,文中这么写 4.end document前ckwx是自己命名的bib的名字

C语言Linux进度条模拟

在Linux字符界面中,使用yum、apt下载东西时会有一个图形化的进度条,可以告诉我们任务的执行进度。 我们也可以通过C语言实现一个类似的进度条,并且可以做得更加美观。以后我们自己写的程序需要显示进度时就可以去调用我们自己实现的进度条。 …

【算法】贪心算法——柠檬水找零

题解:柠檬水找零(贪心算法) 目录 1.题目2.题解3.参考代码4.证明5.总结 1.题目 题目链接:LINK 2.题解 分情况讨论 贪心算法 当顾客为5元时,收下当顾客为10元时,收下10元并找回5元当顾客为20元时,收下20元并找回10…

图像交换部分区域或帧

生成一个boundingbox,或区间 给定矩形框占图像的面积比例,和图像的宽W高H,生成矩形框。根据给定的矩形框,交换两张图像的部分区域。 这里为了方便展示,简化问题,给定一个图像数组mels,对第 i …

基于SSM框架的垃圾分类系统的设计与实现(含源码+sql+开题报告+论文+论文答辩模板)

图1 前台首页截图 首页展示:首页展示法律法规、公示公告、用户交流论坛、分类指南、垃圾站点、以及个人中心; 法律法规:展示我国《城市生活垃圾分类及其评价标准》以及《生活垃圾分类标志》等最新法律法规; 公示公告&#xff1…