MySQL学习Day27——MySQL事务日志

时间:2024-03-18 09:22:44

事务的隔离性由锁机制实现,而事务的原子性、一致性和持久性由事务的redo日志和undo日志来保证。其中REDO LOG称为重做日志,提供再写入操作,恢复提交事务修改的页操作,用来保证事务的持久性,redo log是存储引擎层生成的日志,记录的是物理级别上的页修改操作,主要为了保证数据的可靠性;UNDO LOG称为回滚日志,回滚行记录到某个特定版本,用来保证事务的原子性和一致性,undo log是存储引擎层生成的日志,记录的是逻辑操作日志。

一、redo日志:

InnoDB存储引擎是以页为单位来管理存储空间的。在真正访问页面之前,需要把在磁盘上的页缓存到内存中的Buffer Pool之后才可以访问。所有的变更都必须先更新缓冲池中的数据,然后缓冲池中的脏页会以一定的频率被刷入磁盘(checkPoint机制),通过缓冲池来优化CPU和磁盘之间的鸿沟,这样就可以保证整体的性能不会下降太快。

1.为什么需要REDO日志:

一方面,缓冲池可以消除CPU和磁盘之间的鸿沟,checkpoint机制可以保证数据的最终落盘,然而由于checkpoint并不是每次变更的时候就触发的,而是master线程隔一段时间去处理的。所以最坏的情况就是事务提交后刚写完缓冲池时数据库服务器宕机,那么这段数据就是丢失的,无法恢复。另一方面,事务包含持久性的特性,对于一个已经提交的事务,在事务提交后即使系统发生了崩溃,这个事务对数据库中所做的更改也不能丢失。

InnoDB引擎的事务采用了WAL技术(Write-Ahead Logging),这种技术的思想就是先写日志,再写磁盘,只有日志写入成功,才算事务提交成功,这里的日志就是redo log。当发生宕机且数据未刷到磁盘的时候,可以通过redo log来恢复。

2.REDO日志的好处:

(1)redo日志降低了刷盘频率

(2)redo日志占用的空间非常小

3.REDO日志的特点:

(1)redo日志是顺序写入磁盘的:

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

(2)事务的执行过程中,redo log不断记录:<