什么是Redo Log
Redo Log是数据库系统的一种事务日志,用于记录数据库中发生的所有更改操作。这些操作包括INSERT、UPDATE和DELETE等,以及相关的数据页更新。
Redo Log的作用
Redo Log的作用,主要包含如下3点:
1.数据恢复
比如:MySQL实例挂了或宕机了,重启时InnoDB存储引擎会使用redo log恢复数据,保证数据的持久性与完整性。
2.持久性
Redo Log确保了事务的持久性,即使数据库崩溃,已提交的事务更改也不会丢失。
3.事务恢复
在数据库崩溃或发生故障时,Redo Log用于恢复未提交的事务,确保数据的一致性和完整性。
Redo Log的组成
Redo Log通常由以下部分组成:重做日志缓冲 (redo log buffer)和重做日志文件 (redo log file)。
1.重做日志缓冲 (redo log buffer)
重做日志缓冲(Redo Log Buffer)是数据库系统中的一个内存区域,用于临时存储事务的重做日志信息。
这片内存空间被划分成若干个连续的 redo log block,一个 redo log block 占用 512 字节大小。
如下图所示:
当一个事务开始执行时,它的更改操作会首先写入重做日志缓冲而不是直接写入重做日志文件(磁盘)。
这样可以避免频繁的磁盘I/O,提高了事务的执行速度。
参数设置:
innodb_log_buffer_size,它表示 redo log buffer 大小:默认是 16M ,最大值是 4096M,最小值为 1M。
如下所示:
mysql> show variables like '%innodb_log_buffer_size%'; ------------------------ ---------- | Variable_name | Value | ------------------------ ---------- | innodb_log_buffer_size | 16777216 | ------------------------ ----------
2.重做日志文件 (redo log file)
重做日志文件用于记录数据库中的更改操作,包括INSERT、UPDATE、DELETE等,以及相关的数据页更新。
它们的主要作用是确保数据的持久性,即使在数据库崩溃或发生故障时,已提交的事务更改也不会丢失。
通常,重做日志文件被组织成文件组,每个文件组包含一个或多个具体的重做日志文件。
redo 日志文件如图所示:
其中的 ib_logfile0 和 ib_logfile1 即为 redo 日志。
重做日志文件通常采用循环写入的方式运行,一旦一个文件组的所有文件都被写满,数据库系统会自动切换到下一个文件组。
1.Redo Log文件组(Redo Log Groups)
这是Redo Log的最高层次,通常有多个文件组,每个组包含一组Redo Log文件,这些文件用于记录数据库更改操作。
2.Redo Log文件(Redo Log Files)
每个Redo Log文件组包含一个或多个Redo Log文件,这些文件是实际记录更改操作的地方,Redo Log文件通常以二进制格式存储。
3.Redo Log记录(Redo Log Records)
每个Redo Log文件包含一系列Redo Log记录,这些记录记录了事务的更改操作。
记录中包含以下信息:
- 事务ID(Transaction ID): 用于标识事务的唯一标识符,以便在恢复过程中进行区分。
- 操作类型(Operation Type): 指示该记录包含的操作类型,如INSERT、UPDATE、DELETE等。
- 数据页标识符(Page Identifier): 指示受影响的数据页的标识符,以确定更改的范围。
- 更改前数据(Before Image): 记录了更改操作之前的数据。这是为了在需要回滚或恢复时提供旧数据的副本。
- 更改后数据(After Image): 记录了更改操作之后的数据。这是为了在需要重放操作时提供新数据的副本。
4.Redo Log Header(Redo Log头部)
每个Redo Log文件的开头包含一个头部,用于标识文件的版本信息和元数据。
头部通常包括:文件序列号、创建时间戳、文件大小等信息。
5.Redo Log Checkpoint(Redo Log检查点)
这是一个指示数据库系统在何处写入Redo Log文件的位置的标记。
检查点通常由数据库系统定期更新,以确保在数据库崩溃时可以正确地恢复到一致状态。
Redo Log的工作流程
以一个更新事务为例,redo log 流转过程,如下图所示:
主要包括如下流程:
- 当事务开始时,相关更改操作会首先写入数据库缓冲区。
- 然后,这些更改操作被写入Redo Log缓冲区,但不是直接写入磁盘。
- 当事务提交时,Redo Log缓冲区中的更改操作会被刷新到Redo Log文件中,确保持久性。
- 如果数据库崩溃,可以使用Redo Log文件中的记录来恢复已提交的事务更改。
Redo Log与Bin Log的区别
- Redo Log: 包含了更改前和更改后的数据,用于重放已提交事务的更改。
- Binlog: 包含了SQL语句或二进制数据,用于重建数据库的更改操作。
Redo Log与Undo Log的区别
- Redo Log用于记录已提交的更改操作,以确保持久性和数据恢复。
- Undo Log用于记录事务的未提交更改操作,以支持事务回滚和读一致性。
总之,Redo Log是数据库系统中的重要组成部分,它确保了数据的持久性、一致性和可恢复性。
陈睿mikechen
10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获取更多技术干货!
后台回复【面试】即可获取《史上最全阿里Java面试题总结》,后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》