目录
undo log的作用
undo log的生成与管理
undo log与事务操作
undo log的配置与优化
undo log结构
整体结构
回滚段(Rollback Segment)
undo log段(Undo Log Segment)
undo log页(Undo Log Page)
undo log记录(Undo Log Record)
文件组织方式
MySQL数据库的InnoDB存储引擎中的undo log(回滚日志)是确保事务ACID特性中原子性的关键组件。以下是对undo log的详细解释:
undo log的作用
-
实现事务回滚:
- 在事务处理过程中,如果出现了错误或者用户执行了ROLLBACK语句,MySQL可以利用undo log中的历史数据将数据恢复到事务开始之前的状态。
-
实现多版本并发控制(MVCC):
- undo log为每条记录保存多份历史数据,MySQL在执行快照读(普通SELECT语句)的时候,会根据事务的Read View里的信息,顺着undo log的版本链找到满足其可见性的记录。
undo log的生成与管理
-
生成时机:
- 每当InnoDB引擎对一条记录进行操作(修改、删除、新增)时,会把回滚时需要的信息都记录到undo log里。
-
管理方式:
- InnoDB对undo log文件的管理采用段的方式,即回滚段(rollback segment)。每个回滚段记录了多个undo log segment,每个事务只会使用一个undo log segment。
- 在MySQL 5.5及之前的版本中,只有一个回滚段,因此最大同时支持的事务数量为1024个。从MySQL 5.6开始,InnoDB支持最大128个回滚段,因此其支持同时在线的事务限制提高到了128×1024。
-
回收处理:
- 事务在提交时,并不会立刻删除undo log。InnoDB会将该事务对应的undo log放入到删除列表中,后续会通过后台线程purge thread进行回收处理。
undo log与事务操作
-
插入操作:
- 在插入一条记录时,undo log会记录这条记录的主键值。这样,在回滚时只需要把这个主键值对应的记录删掉即可。
-
删除操作:
- 在删除一条记录时,undo log会记录这条记录中的内容。这样,在回滚时再把由这些内容组成的记录插入到表中即可。
-
更新操作:
- 在更新一条记录时,undo log会记录被更新的列的旧值。这样,在回滚时再把这些列更新为旧值即可。
undo log的配置与优化
-
设置undo log文件所在的路径:
- 可以通过
innodb_undo_directory
参数来设置undo log文件所在的路径。该参数的默认值为"./",即innodb数据文件存储位置。
- 可以通过
-
设置undo log文件内部回滚段的个数:
- 可以通过
innodb_undo_logs
参数来设置undo log文件内部回滚段的个数。默认值为128。
- 可以通过
-
设置undo log文件的数量:
- 可以通过
innodb_undo_tablespaces
参数来设置undo log文件的数量,这样回滚段可以较为平均地分布在多个文件中。
- 可以通过
undo log结构
整体结构
undo log存放在数据库内部的一个特殊段中,这个段称为undo段,它位于共享表空间中。从MySQL 5.6版本开始,undo log也可以存储在独立表空间中。
回滚段(Rollback Segment)
-
概念:
- 回滚段是undo log的一种组织方式,它用于维护undo log的并发写入和持久化。
-
结构:
- 每个回滚段记录了多个undo log segment(slot),每个事务在需要记录undo log时会申请一个或两个slot(insert和update/delete分开)。
- Rollback Segment Header(回滚段头)通常位于回滚段的第一个页,它管理着回滚段的各种信息,如最大page数、history list包含的page数、history list的Base Node等。
undo log段(Undo Log Segment)
-
概念:
- undo log段是undo log的基本存储单位,它包含了多个undo log page。
-
结构:
- 每个undo log段都有一个Undo Segment Header(undo段头),它记录了该段的状态、最后一个undo log header的位置等信息。
- undo log page是undo log的实际存储单元,它包含了undo log记录以及页头信息等。
undo log页(Undo Log Page)
-
概念:
- undo log页是undo log记录的基本存储单元,它包含了多个undo log记录。
-
结构:
- 每个undo log页都有一个页头(Undo Page Header),它记录了该页的一些状态信息,如页类型、最新事务开始记录undo log的起始位置、页内空闲空间起始地址等。
- undo log记录则存储在页体的空闲空间中,每个记录都包含了事务ID、事务号、删除标记、日志起始偏移量等信息。
undo log记录(Undo Log Record)
-
概念:
- undo log记录是undo log的最小存储单元,它记录了某个事务对数据库的具体修改操作。
-
结构:
- undo log记录包含了事务ID、事务号、操作类型(如insert、update、delete)、操作前的数据值等信息。对于insert操作,undo log记录会包含插入记录的主键值;对于delete操作,undo log记录会包含被删除记录的内容;对于update操作,undo log记录会包含被更新列的旧值。
文件组织方式
-
header page和normal page:
- undo page一般分为header page和normal page两种。header page除了包含normal page的信息外,还包含一些undo segment信息。一个undo header page同一时刻只隶属于同一个活跃事务,但它可能包含多个已经提交的事务和一个活跃事务的undo log记录。当活跃事务产生的undo record超过undo header page容量后,会单独再为此事务分配undo normal page。
-
history list:
- 已经提交但还没有被purge线程回收的undo log会被串联起来形成一个history list。purge线程可以通过这个list对没有事务使用的undo log进行回收处理。