InnoDB之Redo Log(重做日志)
重做日志是基于磁盘的数据结构,在崩溃恢复期间用于纠正不完整事务写入的数据。在正常操作期间,重做日志对更改表数据的请求进行编码,这些请求是由SQL语句或低级API调用引起的。在初始化期间以及接受连接之前,会自动重播未完成意外关闭之前未完成更新数据文件的修改。有关重做日志在崩溃恢复中的作用的信息,请参见 “ InnoDB恢复”。
默认情况下,重做日志在磁盘上由名为ib_logfile0
和 的两个文件物理表示ib_logfile1
。MySQL以循环方式写入重做日志文件。重做日志中的数据根据受影响的记录进行编码;此数据统称为重做。通过重做日志的数据传递以不断增加的LSN值表示。
有关相关信息,请参阅 重做日志文件配置和 “优化InnoDB重做日志”。
更改InnoDB重做日志文件的数量或大小
要更改InnoDB
重做日志文件的数量或大小,请 执行以下步骤:
1.停止MySQL服务器,并确保它关闭且没有错误。2.编辑my.cnf
以更改日志文件配置。要更改日志文件的大小,请配置 innodb_log_file_size
。要增加日志文件的数量,请配置 innodb_log_files_in_group
。3.再次启动MySQL服务器。
如果InnoDB
检测到 innodb_log_file_size
与重做日志文件大小不同,它将写入日志检查点,关闭并删除旧的日志文件,以请求的大小创建新的日志文件,然后打开新的日志文件。
组提交以重做日志刷新
InnoDB
像任何其他 符合ACID的数据库引擎一样,在提交事务之前刷新事务的重做日志。InnoDB
使用组提交 功能将多个此类刷新请求分组在一起,以避免每次提交都进行一次刷新。使用组提交, InnoDB
可以对日志文件进行一次写入操作,以对大约同时提交的多个用户事务执行提交操作,从而显着提高了吞吐量。
有关性能COMMIT
和其他事务操作的更多信息 ,请参见“优化InnoDB事务管理”。
撤消日志(Undo Logs)
撤消日志是与单个读写事务关联的撤消日志记录的集合。撤消日志记录包含有关如何撤消事务对聚簇索引 记录的最新更改的信息。如果另一个事务需要将原始数据视为一致读取操作的一部分,则将从撤消日志记录中检索未修改的数据。撤消日志存在于 撤消日志段中,撤消日志段中包含 撤消日志段。回滚段位于 系统表空间,撤消表空间和临时表空间中。
驻留在临时表空间中的撤消日志用于修改用户定义的临时表中的数据的事务。这些撤消日志未重做记录,因为崩溃恢复不需要它们。它们仅在服务器运行时用于回滚。这种类型的撤消日志通过避免重做日志I O来提高性能。
InnoDB
支持最多128个回滚段,其中32个分配给临时表空间。剩下的96个回滚段可以分配给修改常规表中数据的事务。该 innodb_rollback_segments
变量定义通过使用回退段的数目 InnoDB
。
回滚段支持的事务数取决于回滚段中的撤消插槽数和每个事务所需的撤消日志数。
回退段中撤消插槽的数量根据InnoDB
页面大小而有所不同。
InnoDB页面大小 | 回滚段中的撤消插槽数(InnoDB页面大小/ 16) |
4096 (4KB) | 256 |
8192 (8KB) | 512 |
16384 (16KB) | 1024 |
32768 (32KB) | 2048 |
65536 (64KB) | 4096 |
一个事务最多可以分配四个撤消日志,以下每种操作类型都可以分配一个:
1.INSERT
用户定义表上的操作2.UPDATE
和 DELETE
用户定义表上的操作3.INSERT
用户定义的临时表上的操作4.UPDATE
和 DELETE
用户定义的临时表上的操作
撤消日志根据需要分配。例如,对常规和临时表执行INSERT
, UPDATE
和 DELETE
操作的事务需要完全分配四个撤消日志。仅对INSERT
常规表执行操作的事务 需要单个撤消日志。
从已分配的系统表空间或撤消表空间回滚段中分配了对常规表执行操作的事务的撤消日志。从指定的临时表空间回滚段中分配了对临时表执行操作的事务的撤消日志。
分配给事务的撤消日志在其持续时间内一直与事务相关。例如,为INSERT
常规表上的操作分配给事务的撤消日志用于该事务INSERT
在常规表上执行的所有 操作。
给定上述因素,可以使用以下公式来估计InnoDB
能够支持的并发读写事务数。
注意
在达到InnoDB
能够支持的并发读写事务数之前,事务可能会遇到并发事务限制错误。当分配给事务的回滚段用尽撤消插槽时,就会发生这种情况。在这种情况下,请尝试重新运行事务。
当事务对临时表执行操作时,InnoDB
能够支持的并发读写事务 数受分配给临时表空间的回滚段数(即32)限制。