it编程 > 数据库 > Mysql

MySQL日志UndoLog的作用

4人参与 2025-12-09 Mysql

一、undo log 的作用

  1. 事务回滚
    当事务执行过程中出现错误或主动回滚时,innodb 需要将数据恢复到修改前的状态。undo log 记录了数据被修改前的信息,可以根据 undo log 回滚数据。

  2. mvcc(多版本并发控制)
    为了支持高并发下的读写,innodb 实现了 mvcc。undo log 保存了数据修改前的版本信息,快照读(如 select … where …)可以通过 undo log 读取到历史版本的数据,实现非阻塞读。

  3. 崩溃恢复
    在数据库异常宕机时,undo log 可以帮助恢复未提交事务的数据,保证数据一致性。

二、undo log 的分类

undo log 主要分为两种类型:

  1. insert undo log
    记录插入操作(insert),主要用于回滚未提交的插入操作。
    只在事务未提交前有效,事务提交后会被立即清理。

  2. update undo log
    记录更新操作(update、delete),保存被修改行的旧版本。
    除了回滚,还用于 mvcc 的快照读,因此即使事务提交,update undo log 还会保留一段时间,直到没有快照读引用它。

三、undo log 的存储

四、undo log 的工作流程

  1. 当事务对数据进行修改(如 update),innodb 会先将原数据写入 undo log。
  2. 事务提交前,undo log 会一直保留,用于回滚和快照读。
  3. 事务提交后,insert undo log 会被立即清理;update undo log 会等到没有快照读引用它时才被清理(称为 purge)。
  4. undo log 的清理由后台线程(purge)异步进行,避免影响主业务。

五、undo log 与 mvcc 的关系

六、undo log 的性能与管理

七、相关参数与命令

八、常见问题

  1. undo log 占用空间过大怎么办?

    • 检查是否有长事务或长时间未提交的快照读。
    • 增加 purge 线程数(innodb_purge_threads)。
    • 合理设计业务,避免长事务。
  2. undo log 会影响性能吗?

    • undo log 写入是必须的,但一般不会成为性能瓶颈。
    • 长时间未清理的 undo log 可能导致空间膨胀,影响性能。

九、undo log 的结构

undo log 并不是简单地记录一行数据的旧值,它实际上是一个链式的数据结构。每个数据行的修改都会生成一个 undo log 记录,这些记录通过链表串联起来,形成所谓的“版本链”。

十、undo log 的生命周期

  1. 生成
    事务对数据进行更改时,立即生成 undo log 记录。

  2. 保留

    • 未提交事务:undo log 必须保留,以便回滚。
    • 已提交事务:update undo log 还需保留,直到所有快照读都不再需要该版本。
  3. 清理(purge)

    • 后台 purge 线程会定期清理不再被引用的 undo log。
    • 清理时,undo log 会从表空间中物理删除。

十一、undo log 的清理机制(purge)

十二、undo log 与 redo log 的区别

方面undo logredo log
作用回滚、mvcc、快照读崩溃恢复、持久化
写入时机数据修改前数据修改后
内容记录数据修改前的旧值记录数据修改后的新值
事务提交时处理部分立即清理,部分延迟清理需要持久化写盘
存储位置undo 表空间redo 日志文件(ib_logfile)

十三、典型问题分析

  1. 长事务导致 undo log 堆积

    • 长事务或长时间未提交的快照读会导致 undo log 无法清理,表空间膨胀。
    • 解决方法:优化业务逻辑,避免长事务,及时提交。
  2. undo log 影响 ddl 操作

    • 大量 undo log 会影响表的 ddl(如 alter table),因为 ddl 需要等待相关 undo log 清理。
    • 解决方法:在执行 ddl 前,确保没有长事务和大批量快照读。
  3. undo log 空间回收慢

    • undo log 清理依赖 purge 线程,线程数不足会导致清理慢。
    • 解决方法:适当增加 innodb_purge_threads,观察 show engine innodb status

十四、undo log 相关源码简析

(如需更深入源码分析可继续追问)

十五、实践建议

  1. 避免长事务和大批量未提交的快照读。
  2. 合理配置 undo 表空间数量和大小。
  3. 关注 purge 线程运行状况,及时调优相关参数。
  4. 定期监控 undo log 的空间占用和清理效率。
  5. 在大数据量操作或 ddl 前,提前处理相关事务,确保 undo log 不会堆积。

总结

undo log 是 innodb 实现事务、回滚、mvcc 的核心机制。合理管理 undo log,有助于提升数据库的稳定性和性能。

到此这篇关于mysql日志undolog的作用的文章就介绍到这了,更多相关mysql日志undolog内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

您想发表意见!!点此发布评论

推荐阅读

Mysql中RelayLog中继日志的使用

12-09

mysql_mcp_server部署及应用实践案例

12-09

MySql 预处理(Preprocessor)的使用小结

12-09

MySQL错误1005(errno: 150)的原因分析与解决方案

12-09

MySQL慢查询优化从30秒到300毫秒的完整过程

12-09

解决MySQL安装第四步报错问题(initializing database(may take a long time)

12-09

猜你喜欢

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论