MySQL锁系列(四)之 undo log

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
日志服务 SLS,月写入数据量 50GB 1个月
简介: 什么是undo 1) redo 记录的是对页的重做日志,undo 记录的是对事务的逆向操作 2) undo 会产生redo,undo的产生也会伴随这redo的产生,因为重启恢复的时候,可以通过redo还原这些undo的操作,以达到回滚的目的 undo有什么用 1) 用于对事务的回滚 2)用于MVCC undo的存储结构 rollback segment * 在MySQL5.

什么是undo

1) redo 记录的是对页的重做日志,undo 记录的是对事务的逆向操作
2) undo 会产生redo,undo的产生也会伴随这redo的产生,因为重启恢复的时候,可以通过redo还原这些undo的操作,以达到回滚的目的

undo有什么用

1) 用于对事务的回滚
2)用于MVCC

undo的存储结构

  • rollback segment
* 在MySQL5.1的年代,一个MySQL实例,就只有一个rollback segment
* 在MySQL5.1+ 的年代,一个MySQL实例里面,可以有128个rollback segment
  • undo segment
* 一个segment 有 1024 个 undo slot,一个undo slot 对应一个undo log
* 一个事务(dml)对应一个undo log
  • 总结
据此推断:

1) 5.1 最多能够承载的并发事务(dml),1 * 1024 = 1024
2)5.1+ 最多能够承载的并发事务(dml),128 * 1024 = 10w左右

从此可以看出,5.1 之后的版本支持的并发写入事务数更多,性能更好

undo的格式

  • insert_undo
1) insert操作产生的undo
2)为什么要单独出来,因为insert的undo可以立马释放(不需要purge),不需要判断是否有其他事务引用,本来insert的事务也没有任何事务可以看见它嘛
  • update_undo
1)delete 或者 update 操作产生的undo日志
2)判断undo是否可以被删除,必须看这个undo上面是否被其他事务所引用
3) 如果没有任何事务引用,那么可以由后台线程purge掉这个undo
  • 如何判断undo日志是否有其他事务引用呢
1. 每一个undo log中都有一个DB_trx_id , 这个id记录的是该undo最近一次被更新的事务id
2. 如果这个id 不在readview(活跃事务列表) 里面,就可以认为没事务引用,即可删除?

undo存放在哪里

1) 5.6之前的版本,undo都是存放在ibdata,也就是所谓的共享表空间里面的
2) 5.6以及之后的版本,可以配置存放在单独的undo表空间中

什么是purge

1) delete语句操作的后,只会对其进行delete mark,这些被标记为删除的记录只能通过purge来进行物理的删除,但是并不回收空间
2)undo log,如果undo 没有任何事务再引用,那么也只能通过purge线程来进行物理的删除,但是并不回收空间

purge后空间就释放了吗

1) undo page里面可以存放多个undo log日志
2)只有当undo page里面的所有undo log日志都被purge掉之后,这个页的空间才可能被释放掉,否则这些undo page可以被重用

DML的相关物理实现算法

  • 主键索引
1. 对于delete   --需要undo绑定该记录才能进行回滚,所以只能打上标记,否则undo指向哪里呢

    delete mark

2. 对于update  --原记录可以物理删除,因为可以在新插入进来的地方进行undo绑定

    * 如果不能原地更新: delete(注意:这里是直接delete,而不是delete mark)  + insert
    * 如果可以原地更新,那么直接update就好
  • 二级索引
1. 对于delete  --不能直接被物理删除,因为二级索引没有undo,只能通过打标记,然后回滚。否则如果被物理删除,则无法回滚

    delete mark


2. 对于update  --不能直接被物理删除,因为二级索引没有undo,只能通过打标记,然后回滚。否则如果被物理删除,则无法回滚

    delete mark + insert
相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
9天前
|
存储 SQL 关系型数据库
MySQL日志详解——日志分类、二进制日志bin log、回滚日志undo log、重做日志redo log
MySQL日志详解——日志分类、二进制日志bin log、回滚日志undo log、重做日志redo log、原理、写入过程;binlog与redolog区别、update语句的执行流程、两阶段提交、主从复制、三种日志的使用场景;查询日志、慢查询日志、错误日志等其他几类日志
MySQL日志详解——日志分类、二进制日志bin log、回滚日志undo log、重做日志redo log
|
2天前
|
SQL 关系型数据库 MySQL
MySQL底层概述—10.InnoDB锁机制
本文介绍了:锁概述、锁分类、全局锁实战、表级锁(偏读)实战、行级锁升级表级锁实战、间隙锁实战、临键锁实战、幻读演示和解决、行级锁(偏写)优化建议、乐观锁实战、行锁原理分析、死锁与解决方案
MySQL底层概述—10.InnoDB锁机制
|
1天前
|
关系型数据库 MySQL 网络安全
如何排查和解决PHP连接数据库MYSQL失败写锁的问题
通过本文的介绍,您可以系统地了解如何排查和解决PHP连接MySQL数据库失败及写锁问题。通过检查配置、确保服务启动、调整防火墙设置和用户权限,以及识别和解决长时间运行的事务和死锁问题,可以有效地保障应用的稳定运行。
39 25
|
8天前
|
SQL 缓存 关系型数据库
MySQL原理简介—7.redo日志的底层原理
本文介绍了MySQL中redo日志和undo日志的主要内容: 1. redo日志的意义:确保事务提交后数据不丢失,通过记录修改操作并在系统宕机后重做日志恢复数据。 2. redo日志文件构成:记录表空间号、数据页号、偏移量及修改内容。 3. redo日志写入机制:redo日志先写入Redo Log Buffer,再批量刷入磁盘文件,减少随机写以提高性能。 4. Redo Log Buffer解析:描述Redo Log Buffer的内存结构及刷盘时机,如事务提交、Buffer过半或后台线程定时刷新。 5. undo日志原理:用于事务回滚,记录插入、删除和更新前的数据状态,确保事务可完整回滚。
|
20天前
|
监控 Oracle 关系型数据库
Mysql、Oracle审计日志的开启
通过上述步骤,可以在 MySQL 和 Oracle 数据库中启用和配置审计日志。这些日志对于监控数据库操作、提高安全性和满足合规性要求非常重要。确保正确配置审计参数和策略,定期查看和分析审计日志,有助于及时发现并处理潜在的安全问题。
38 11
|
1月前
|
SQL 关系型数据库 MySQL
MySQL事务日志-Undo Log工作原理分析
事务的持久性是交由Redo Log来保证,原子性则是交由Undo Log来保证。如果事务中的SQL执行到一半出现错误,需要把前面已经执行过的SQL撤销以达到原子性的目的,这个过程也叫做"回滚",所以Undo Log也叫回滚日志。
MySQL事务日志-Undo Log工作原理分析
|
27天前
|
存储 关系型数据库 MySQL
MySQL进阶突击系列(06)MySQL有几种锁?| 别背答案,现场演示一下
本文详细解析了MySQL InnoDB存储引擎的锁机制,涵盖读锁、写锁、意向锁、记录锁、间隙锁和临键锁等8种锁类型。重点探讨了不同锁类型的加锁与释放方式,以及事务并发场景下的实战验证。通过具体示例,展示了在不同情况下锁的行为及其对事务的影响。文章还特别强调了锁的作用范围主要是索引,并解释了锁如何影响数据的读写操作。最后总结了并发事务中加锁规则,帮助读者深入理解MySQL的锁机制。
|
23天前
|
关系型数据库 MySQL 数据库连接
数据库连接工具连接mysql提示:“Host ‘172.23.0.1‘ is not allowed to connect to this MySQL server“
docker-compose部署mysql8服务后,连接时提示不允许连接问题解决
|
10天前
|
关系型数据库 MySQL 数据库
Docker Compose V2 安装常用数据库MySQL+Mongo
以上内容涵盖了使用 Docker Compose 安装和管理 MySQL 和 MongoDB 的详细步骤,希望对您有所帮助。
81 42
|
28天前
|
缓存 关系型数据库 MySQL
【深入了解MySQL】优化查询性能与数据库设计的深度总结
本文详细介绍了MySQL查询优化和数据库设计技巧,涵盖基础优化、高级技巧及性能监控。
219 0