doc: 阅读undo log文档

This commit is contained in:
asahi
2025-07-09 12:52:39 +08:00
parent e3e6bc99ac
commit 94a8f8eadc

View File

@@ -250,5 +250,37 @@ page(2,4), offset 64, value 2; # 辅助索引页
```
由上述示例可知redo log为物理日志记录的是对页的物理修改故而`redo log是幂等的`
### undo
redo log记录了对页的物理操作可以用于进行`redo`。而undo和redo不同undo主要用于对事务的回滚。
undo的存放位置和redo不同
- redo log存放在redo log file中
- undo log存放在数据库内部的segment中该segment被称为`undo segment``undo段位于共享的表空间内`
#### undo log和redo log差异
- redo log为物理日志记录的是对页的修改而undo log则是逻辑日志对每个insert操作undo log会生成一个相反的delete对update也会生成另一个逆向的update
- redo log是全局的innodb中所有事务都会`向同一个redo log交叉写入`而undo log则是针对事务的每个事务都有其自己的undo log chain
#### 非锁定读
除了用于事务回滚外undo log还可以用于MVCC。当事务A尝试读取一条记录R时如果记录R已经被另一个事务B占用那么事务A可以通过undo log读取行数据之前的版本。
上述实现被称为`非锁定读`
#### undo log的产生会伴随redo log的产生
`undo log其本质仍然是数据`。undo log其存放在表空间的undo segment中仍然可被可做是数据`WAL(write-ahead logging)要求变更被应用到数据库之前,需要先写入日志`
故而在生成undo log时对于undo页的修改也会被记录到redo log中。
#### 存储管理
innodb通过segment来管理undo log其管理方式如下
- innodb包含rollback segment
- 每个rollback segment会记录1024个undo log segment
- undo log segment中会进行undo页的申请
- 共享表空间偏移量为5的页会记录所有rollback segment header所在的页
- 偏移量为5的页类型为FIL_PAGE_TYPE_SYS
##### innodb_undo_directory
该参数用于设置rollback segment文件所在的路径默认为`./`,代表`datadir`