4人参与 • 2025-12-09 • Mysql
事务回滚
当事务执行过程中出现错误或主动回滚时,innodb 需要将数据恢复到修改前的状态。undo log 记录了数据被修改前的信息,可以根据 undo log 回滚数据。
mvcc(多版本并发控制)
为了支持高并发下的读写,innodb 实现了 mvcc。undo log 保存了数据修改前的版本信息,快照读(如 select … where …)可以通过 undo log 读取到历史版本的数据,实现非阻塞读。
崩溃恢复
在数据库异常宕机时,undo log 可以帮助恢复未提交事务的数据,保证数据一致性。
undo log 主要分为两种类型:
insert undo log
记录插入操作(insert),主要用于回滚未提交的插入操作。
只在事务未提交前有效,事务提交后会被立即清理。
update undo log
记录更新操作(update、delete),保存被修改行的旧版本。
除了回滚,还用于 mvcc 的快照读,因此即使事务提交,update undo log 还会保留一段时间,直到没有快照读引用它。
undo tablespace)。innodb_undo_tablespaces)。innodb_undo_tablespaces:设置 undo 表空间数量。innodb_undo_log_truncate:开启自动截断 undo log。show engine innodb status; 可以查看当前 undo log 相关信息。undo log 占用空间过大怎么办?
innodb_purge_threads)。undo log 会影响性能吗?
undo log 并不是简单地记录一行数据的旧值,它实际上是一个链式的数据结构。每个数据行的修改都会生成一个 undo log 记录,这些记录通过链表串联起来,形成所谓的“版本链”。
undo record
每个 undo log 记录包含:
版本链(version chain)
每行数据都可以通过 undo log 找到历史版本。快照读时,innodb 会沿着版本链查找满足可见性规则的版本。
生成
事务对数据进行更改时,立即生成 undo log 记录。
保留
清理(purge)
innodb_purge_threads:设置 purge 线程数量,提升清理效率。innodb_max_purge_lag:控制 purge 的延迟,防止主业务受影响。| 方面 | undo log | redo log |
|---|---|---|
| 作用 | 回滚、mvcc、快照读 | 崩溃恢复、持久化 |
| 写入时机 | 数据修改前 | 数据修改后 |
| 内容 | 记录数据修改前的旧值 | 记录数据修改后的新值 |
| 事务提交时处理 | 部分立即清理,部分延迟清理 | 需要持久化写盘 |
| 存储位置 | undo 表空间 | redo 日志文件(ib_logfile) |
长事务导致 undo log 堆积
undo log 影响 ddl 操作
undo log 空间回收慢
innodb_purge_threads,观察 show engine innodb status。(如需更深入源码分析可继续追问)
trx0undo.c、trx0purge.c、row0vers.c 等文件。undo log 是 innodb 实现事务、回滚、mvcc 的核心机制。合理管理 undo log,有助于提升数据库的稳定性和性能。
到此这篇关于mysql日志undolog的作用的文章就介绍到这了,更多相关mysql日志undolog内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论