文章目录
-
-
-
- 事务ACID特性是如何实现的
- Redo日志
- 为什么需要Redo日志
- Redo日志特点、好处
- Redo日志的组成
-
-
- 缓冲区(`redo log buffer`)
- 日志文件区(`redo log file`)
-
- Redo日志运行流程
-
-
事务ACID特性是如何实现的
事务的四种特性大家都知道是原子性、一致性、隔离性和持续性,也就是ACID,那么这四种特性是如何实现的呢?
- 隔离性由锁机制实现
- 剩下的三种特性由事务的redo和undo日志实现:
1.Redo Log
是重做日志,可以再写入,恢复提交事务修改的数据页操作,来保证事务的持久性
2.Undo Log
是回滚日志,回滚行记录到某个保存点,来保证事务的原子性和一致性。
redo log 是存储引擎层(innodb)生成的日志,记录的是物理层面的对数据页的操作,比如在某数据页某偏移量下写入或删除了某数据。
undo log:存储引擎层(innodb)生成的日志,记录的是逻辑层面的操作,且记录的都是相反的操作,比如对某行数据进行了insert操作,uodo日志中就会记载相反的操作delete,主要用于事务的回滚。
- Redo和Undo本质上都是一种恢复操作。
Undo
是把对数据表的操作回滚回去的行为,而Redo
操作是比如对表数据进行了操作,但是没有刷新到磁盘上时,数据库宕机了,在数据库重启后,可以去Redo日志中找回这种操作的记录,继续执行。
Redo日志
数据库的存储引擎(Innodb)是以数据页为单位来管理存储空间的,所有的数据都是放在磁盘中的。
加载一个数据页中的数据,需要先将这个数据页从磁盘缓存到内存中(放在Buffer Pool
中)然后才可以访问。我们对数据库的增删改操作都是对内存中数据的修改,然后内存在将数据的变动以一定的频率刷新到磁盘上。
为什么不直接修改磁盘中的数据,而是先将数据加载到内存中,在内存里修改,然后再更新到磁盘上?
因为CPU更新内存中的数据比更新磁盘中的数据要快
为什么需要Redo日志
- 内存缓冲池的存在可以消除CPU和磁盘之间的割裂
- checkpoint刷盘机制可以保证数据最终刷新到磁盘上
但存在一个问题就是,刷盘机制不是改一点刷一点,而是一个间隔时间内刷新一次,如果在间隔时间内数据库宕机,那么这个间隔时间更新的数据就无法刷新到磁盘上,导致数据丢失。 - 这和数据库持久性相矛盾,持久性要求一旦事务提交,那么事务修改的数据就会永久保存,即使系统崩溃。
那如何解决这个矛盾,来保证持久性?
解决办法就是,每次对内存数据的刷新,都把操作记录下来就好了。就算数据库宕机,我们也可以重启数据库后,重新执行记录的操作,就可以将没有成功刷新的数据刷新到磁盘上。 - Innodb采用了"日志先行"策略,每次修改,先写日志,再写磁盘,只有日志写入成功,才算事务提交成功。
- 日志就是Redo 日志。如果刷盘期间数据库宕机,就可以通过Redo日志来恢复,进一步保证了四大特性中的持久性。
Redo日志特点、好处
好处:
- 相比于直接刷磁盘,redo日志降低了刷盘次数
- redo日志占用的空间非常小
特点:
- 顺序写入(执行事务时,一条语句可能产生若干个日志语句,这些日志语句是按顺序写入磁盘的,是顺序IO,效率比随机IO快)
- 不间断记录。redo 日志记录不间断,区别于bin日志一个事务提交才整个记录一次
Redo日志的组成
分为两个部分:缓冲区和日志文件区
缓冲区(redo log buffer
)
- 缓冲区是内存层面的
- 缓冲区默认大小
16
M,最小是1M,最大4096M - 缓冲区会将空间划分成一个个的缓冲块:
查看缓冲池的大小:
mysql> show variables like '%innodb_log_buffer_size%';
+------------------------+---------+
| Variable_name | Value |
+------------------------+---------+
| innodb_log_buffer_size | 1048576 |
+------------------------+---------+
1 row in set, 1 warning (0.12 sec)
日志文件区(redo log file
)
- 日志文件是磁盘层面的
- 查看mysql目录,其中
logfile0
和logfile1
就是redo日志的文件区:
Redo日志运行流程
- 过程:
1.将原始数据从磁盘读入内存中,修改内存中的数据拷贝
2.生成一条日志记入redo log buffer
中,记录的是数据修改的值
3.当事务提交时,将redo log buffer
中的内容刷新到redo log file
,对redo log file
采取的是追加写的方式
4.隔一段时间就将内存中修改的数据刷寻到磁盘中
版权声明:程序员胖胖胖虎阿 发表于 2022年9月17日 下午10:08。
转载请注明:MySQL~Redo日志和Undo日志理解、为什么要有Redo日志、Redo日志的组成、特点、运行流程 | 胖虎的工具箱-编程导航
转载请注明:MySQL~Redo日志和Undo日志理解、为什么要有Redo日志、Redo日志的组成、特点、运行流程 | 胖虎的工具箱-编程导航
相关文章
暂无评论...