UNDO LOG日志
目录
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进行回收处理。