undo log日志是MySQL数据的一致性、事务管理和故障恢复等关键,需要重点掌握好undo log日志@mikechen
什么是Undo Log
Undo Log是一种记录数据库操作的MySQL日志,通常以文件或表的形式存储在数据库中。
Undo Log主要用于:记录事务执行的所有数据变更,包括插入、更新和删除操作。
Undo Log的作用
Undo日志在数据库管理系统中扮演着重要的角色,其作用包括以下几个方面:
1.支持事务的原子性
如果事务在执行过程中失败或被中断,Undo Log日志可以用于撤销该事务的部分或全部操作,将数据库恢复到之前的状态,以确保原子性。
2.支持多版本控制
有些数据库系统支持多版本数据库(MVCC),其中数据可以具有多个时间点的不同版本。
Undo日志用于维护这些不同版本的数据,以便在需要时可以回滚到先前的数据状态。
3.数据恢复
在数据库发生故障或崩溃时,Undo日志可以用于恢复数据库到一致的状态。
4.支持事务的一致性
如果事务违反了数据库的约束条件或完整性规则,可以使用Undo日志来回滚事务,以确保数据库的一致性。
Undo Log的工作原理
UndoLog的原理很简单,为了满足事务的原子性,在操作任何数据之前,首先将数据备份到一个地方,这个存储数据备份的地方称为UndoLog。
同一个事务对数据进行多次修改或者多个事务对同一个数据进行修改,这些修改会按照时间顺序连成链,所以通过undo log可以发现数据修改的历史。
如下图所示:
Undo日志的记录信息:
- 每个Undo日志记录通常包括以下信息:
- 事务ID:标识执行操作的事务。
- 操作类型:指示是插入、更新还是删除操作。
- 旧数据:如果是更新或删除操作,记录了被更改或删除的数据的旧值。
- 新数据:如果是插入或更新操作,记录了新数据的值。
- 时间戳:记录操作发生的时间。
Undo Log主要分为两种:
1.insert undo log
代表事务在insert新记录时产生的undo log,只在事务回滚时需要,并且在事务提交后可以被立即丢弃
2.update undo log
事务在进行update或delete时产生的undo log,不仅在事务回滚时需要,在快照读时也需要,所以不能随便删除。
只有在快照读或事务回滚不涉及该日志时,对应的日志才会被purge线程统一清除。
回滚和撤销操作:
如果出现了错误或者用户执行了ROLLBACK语句,系统可以利用Undo Log中的备份将数据恢复到事务开始之前的状态。
如果是回滚到事务开始前的状态,系统可以简单地删除或撤销Undo日志中与该事务相关的所有记录。
如果是回滚到事务的某一点,系统会撤销Undo日志中从该点之后的所有记录。
Undo Log的存储机制
Undo日志可以存储在内存中,也可以以磁盘文件的形式存储。
Undo日志的存储通常包括以下方面的考虑:
1.持久性
Undo日志必须确保其数据在数据库发生故障或崩溃时不会丢失。
因此,通常会将Undo日志的数据写入持久性存储介质,如磁盘,这确保了数据的持久性。
2.数据格式
Undo日志中记录的数据通常以二进制格式存储,以节省空间并提高写入和读取性能。
数据格式需要与数据库管理系统的内部数据结构相匹配,以便于撤销操作和恢复数据。
3.分段存储
Undo日志可以根据事务或数据块进行分段存储,每个事务的Undo日志记录可以存储在单独的Undo日志段中,以便更容易管理和维护。
这也有助于并发性能,因为不同事务的Undo日志可以并行写入不同的段。
4.回滚指针
Undo日志中的每个记录通常包括指向原始数据位置的指针,以便在需要回滚操作时可以快速找到并修改数据。
这些指针可以是物理指针(指向磁盘上的数据页)或逻辑指针(指向数据行或数据块)。
5.空间回收
由于Undo日志会随着时间增长,数据库管理系统通常需要执行空间回收操作。
这可以包括标记不再需要的Undo日志段以供重用,或者定期删除旧的Undo日志数据,以释放磁盘空间。
6.日志刷写
Undo日志中的数据通常不是实时写入磁盘的,而是由数据库管理系统控制何时将数据刷写到磁盘。
这可以通过缓冲机制来提高性能,但需要确保在发生故障时不会丢失重要的Undo日志数据。
总的来说,Undo log日志是数据库管理系统的一个关键组成部分,用于确保数据的一致性和可恢复性。
Undo log记录了对数据库的所有变更,以便在事务失败或需要回滚时,可以撤销这些变更,将数据库恢复到一致的状态。
陈睿mikechen
10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获取更多技术干货!
后台回复【面试】即可获取《史上最全阿里Java面试题总结》,后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》