目录
Doublewrite Buffer
doublewrite缓冲区是系统表空间中的一个存储区域,InnoDB在将从缓冲池中刷新的页面写入数据文件中的适当位置之前,将它们写入其中。只有在刷新页面并将其写入doublewrite缓冲区之后,InnoDB才会将页面写入其正确的位置。如果在页面写入过程中出现操作系统、存储子系统或mysqld进程崩溃,InnoDB可以在崩溃恢复期间从doublewrite缓冲区中找到页面的一个好副本。
尽管数据总是写两次,但doublewrite缓冲区不需要两倍的I/O开销或两倍的I/O操作。数据作为一个大的连续块写入doublewrite缓冲区,只需对操作系统进行一次fsync()调用。
在大多数情况下,默认情况下启用双写缓冲区。要禁用doublewrite缓冲区,请将 innodb_doublewrite
设置为0。
如果系统表空间文件(“ibdata文件”)位于支持原子写入的Fusion io设备上,则会自动禁用doublewrite缓冲,并对所有数据文件使用Fusion-io原子写入。由于doublewrite缓冲区设置是全局的,因此也会对驻留在non-Fusion-io 硬件上的数据文件禁用doublewrite缓冲。此功能仅在 Fusion-io硬件上受支持,并且仅在Linux上为Fusion-io NVMFS启用。为了充分利用这一特性,建议将innodb_flush_method
设置为O_DIRECT。
Redo Log
重做日志是一种基于磁盘的数据结构,用于在崩溃恢复期间更正不完整事务写入的数据。在正常操作期间,重做日志对更改由SQL语句或低级API调用产生的表数据的请求进行编码。未在意外关机之前完成数据文件更新的修改将在初始化期间和接受连接之前自动重播。有关重做日志在崩溃恢复中的角色的信息,请参阅Section 14.19.2, “InnoDB Recovery”.
默认情况下,重做日志在磁盘上由两个名为ib_logfile0和ib_logfile1的文件物理表示。MySQL以循环方式写入重做日志文件。重做日志中的数据根据受影响的记录进行编码;这些数据统称为重做。通过重做日志的数据通道由不断增加的LSN值表示。
有关信息,请参阅 Redo Log File Configuration和 Section 8.5.4, “Optimizing InnoDB Redo Logging”.
更改InnoDB重做日志文件的数量或大小
要更改InnoDB重做日志文件的数量或大小,请执行以下步骤:
- 停止MySQL服务器并确保它在没有错误的情况下关闭。
- 编辑my.cnf以更改日志文件配置。要更改日志文件大小,请配置innodb_log_file_size。要增加日志文件的数量,请配置innodb_log_files_in_group。
- 重新启动MySQL服务器。
如果InnoDB检测到 innodb_log_file_size
与重做日志文件大小不同,它将写入日志检查点,关闭并删除旧的日志文件,以请求的大小创建新的日志文件,并打开新的日志文件。
Group Commit for Redo Log Flushing
与任何其他符合ACID的数据库引擎一样,InnoDB在提交事务之前刷新该事务的重做日志。InnoDB使用组提交功能将多个这样的刷新请求分组在一起,以避免每次提交都有一个刷新。对于组提交,InnoDB向日志文件发出一次写操作,以对几乎同时提交的多个用户事务执行提交操作,从而显著提高吞吐量。
有关COMMIT和其他事务操作的性能的更多信息, Section 8.5.2, “Optimizing InnoDB Transaction Management”.
Undo Logs
撤消日志 undo log是与单个读写事务关联的撤消日志记录的集合。撤消日志记录包含有关如何撤消事务对 聚集索引clustered index记录的最新更改的信息。如果另一个事务需要将原始数据视为一致读取操作的一部分,则将从撤消日志记录中检索未修改的数据。撤消日志存在于撤消日志段中,这些日志段包含在回滚段中。回滚段位于系统表空间、撤消表空间 undo tablespaces和临时表空间中。
驻留在临时表空间中的撤消日志用于修改用户定义的临时表中的数据的事务。这些撤消日志不记录重做,因为崩溃恢复不需要它们。它们仅用于服务器运行时的回滚。这种类型的撤消日志通过避免重做日志I/O而提高性能。
InnoDB
支持最多128个回滚段,其中32个被分配给临时表空间。这将留下96个回滚段,可以分配给修改常规表中数据的事务。 innodb_rollback_segments
变量定义innodb使用的回滚段数。
回滚段支持的事务数取决于回滚段中的撤消槽数和每个事务所需的撤消日志数。
回滚段中的撤消槽数根据InnoDB页面大小而不同。
InnoDB Page Size | Number of Undo Slots in a Rollback Segment (InnoDB Page Size / 16) |
---|---|
4096 (4KB) | 256 |
8192 (8KB) | 512 |
16384 (16KB) | 1024 |
32768 (32KB) | 2048 |
65536 (64KB) | 4096 |
一个事务最多分配四个撤消日志,以下操作类型各一个:
根据需要分配撤消日志(Undo logs )。例如,对常规表和临时表执行插入、更新和删除操作的事务需要四个撤消日志的完整分配。仅对常规表执行插入 INSERT
操作的事务需要一个撤消日志。
对常规表执行操作的事务将从指定的系统表空间或撤消表空间回滚段分配撤消日志。对临时表执行操作的事务将从已分配的临时表空间回滚段中分配撤消日志。
分配给事务的撤消日志在事务的持续时间内保持与事务的关联。例如,为常规表上的插入操作分配给事务的撤消日志将用于该事务对常规表执行的所有插入操作。
考虑到上述因素,可以使用以下公式来估计InnoDB能够支持的并发读写事务的数量。
Note
在达到InnoDB能够支持的并发读写事务数之前,事务可能会遇到并发事务限制错误。当分配给事务的回滚段用完撤消槽时发生这种情况。在这种情况下,请尝试重新运行事务。
当事务对临时表执行操作时,InnoDB能够支持的并发读写事务的数量受分配给临时表空间的回滚段的数量(32)的限制。
(innodb_page_size / 16) * (innodb_rollback_segments - 32)
(innodb_page_size / 16 / 2) * (innodb_rollback_segments - 32)
- 如果每个事务对一个临时表执行一个
INSERT
操作,那么InnoDB能够支持的并发读写事务数是:
(innodb_page_size / 16) * 32
(innodb_page_size / 16 / 2) * 32