重做日志是一种基于磁盘的数据结构,在崩溃恢复期间用于纠正不完整事务写入的数据。在正常操作过程中,重做日志对 SQL 语句或低级API调用产生的表数据更改请求进行编码。在意外关闭之前,未完成数据文件更新的修改将在初始化期间和接受连接之前自动重播。
默认情况下,重做日志在物理上由两个名为 ib_logfile0
和 ib_logfile1
的文件表示。MySQL以循环的方式写入重做日志文件。重做日志中的数据按照受影响的记录进行编码;这些数据统称为重做。数据通过重做日志的通道由不断增加的 LSN 值表示。
LSN 值,“日志序列号”的首字母缩写。这个任意的、不断增长的值表示与重做日志中记录的操作对应的一个时间点。(这个时间点与事务边界无关;它可以位于一个或多个事务的中间。)它在崩溃恢复期间被 InnoDB 内部使用,用于管理缓冲池。
在MySQL 5.6.3之前,LSN 是一个4字节的无符号整数。当重做日志文件大小限制从 4GB 增加到 512GB 时,LSN 在MySQL 5.6.3中变成了一个8字节的无符号整数,因为需要额外的字节来存储额外的大小信息。在MySQL 5.6.3或更高版本上构建的使用 LSN 值的应用程序应该使用64位而不是32位变量来存储和比较 LSN 值。
改变重做日志文件的数量或大小
执行以下步骤修改重做日志文件的个数和大小。
停止MySQL服务器,确保它在没有错误的情况下关闭。
编辑my.cnf来更改日志文件配置。修改日志文件大小需要配置
innodb_log_file_size
。如果需要增加日志文件数量,请配置innodb_log_files_in_group
。重新启动MySQL服务器。
如果 InnoDB 检测到 innodb_log_file_size
与重做日志文件大小不一致,就会写一个日志检查点,关闭并删除旧的日志文件,按照请求的大小创建新的日志文件,然后打开新的日志文件。
重做日志刷新组提交
InnoDB 和其他 ACID 兼容的数据库引擎一样,会在事务提交之前刷新事务的重做日志。InnoDB 使用组提交功能将多个刷新请求分组在一起,以避免每次提交都有一次刷新。使用组提交,InnoDB 会对日志文件发出一次写入,从而对几乎同时提交的多个用户事务执行提交操作,这大大提高了吞吐量。
重做日志进行归档
当备份操作正在进行时,复制重做日志记录的备份实用程序有时可能无法跟上重做日志生成的速度,由于这些记录被覆盖而导致丢失重做日志记录。这个问题通常发生在备份操作期间 MySQL 服务器有重大活动,并且重做日志文件存储介质运行速度比备份存储介质更快的情况下。在 MySQL 8.0.17 中引入的重做日志归档特性,通过将重做日志记录顺序写入归档文件和重做日志文件来解决这个问题。备份实用程序可以根据需要从归档文件中复制重做日志记录,从而避免潜在的数据丢失。
性能考虑
由于附加的写活动,激活重做日志归档通常有较小的性能成本。
在 Unix 和 linux 操作系统上,假设没有持续的高更新速率,性能影响通常很小。在 Windows 上,假设相同,性能影响通常会更高一些。
如果有一个持续的高更新速率,并且重做日志归档文件和重做日志文件在相同的存储介质上,由于复合写活动,性能影响可能会更显著。
如果有一个持续的高更新速率,重做日志归档文件的存储介质比重做日志文件慢,性能会受到任意的影响。
禁用重做日志
从 MySQL 8.0.21 开始,你可以使用 ALTER INSTANCE DISABLE INNODB REDO_LOG
语句来禁用重做日志。这个功能旨在将数据加载到一个新的 MySQL 实例中。禁用重做日志通过避免重做日志写和双写缓冲加速数据加载。
警告:该特性仅用于将数据加载到新的MySQL实例中。不要在生产系统上禁用重做日志。当重做日志被禁用时,允许关闭和重启服务器,但是当重做日志被禁用时,意外的服务器停机可能会导致数据丢失和实例损坏。
当重做日志被禁用时,在服务器意外停止后试图重启服务器被拒绝,出现以下错误:
[ERROR] [MY-013578] [InnoDB] Server was killed when Innodb Redo
logging was disabled. Data files could be corrupt. You can try
to restart the database with innodb_force_recovery=6
在这种情况下,初始化一个新的MySQL实例并再次启动数据加载过程。
需要 INNODB_REDO_LOG_ENABLE
权限来启用和禁用重做日志。
Innodb_redo_log_enabled
状态变量允许监控重做日志状态。
当重做日志被禁用时,克隆操作和重做日志归档是不允许的,反之亦然。
ALTER INSTANCE [ENABLE|DISABLE] INNODB REDO_LOG
操作需要独占备份元数据锁,防止其他 ALTER INSTANCE
操作同时执行。其他 ALTER INSTANCE
操作必须等到锁释放后才能执行。




