重做日志是一种基于磁盘的数据结构,用于在崩溃恢复期间纠正未完成事务写入的数据。在正常操作期间,重做日志会对由SQL语句或低级API调用引起的更改表数据的请求进行编码。在初始化期间和接受连接之前,在意外关闭之前未完成更新数据文件的修改将自动重放。有关重做日志在崩溃恢复中的角色的信息,请参见章节15.18.2,“InnoDB恢复”.
默认情况下,重做日志在磁盘上由两个名为ib_logfile0
而且ib_logfile1
.MySQL以循环的方式写入重做日志文件。重做日志中的数据按照受影响的记录进行编码;这些数据统称为重做。数据在重做日志中的传递用一个不断增加的值表示LSN价值。
与重做日志相关的信息和过程将在本节的以下主题中描述:
改变…的数目或大小重做日志文件,执行以下步骤:
停止MySQL服务器,确保它没有错误地关闭。
编辑
my.cnf
命令,修改日志文件配置。如果要更改日志文件大小,请配置innodb_log_file_size
.如果需要增加日志文件的数量,请配置innodb_log_files_in_group
.重新启动MySQL服务器。
如果InnoDB
检测innodb_log_file_size
与重做日志文件大小不同,它写入一个日志检查点,关闭并删除旧的日志文件,按照所请求的大小创建新的日志文件,并打开新的日志文件。
InnoDB
,就像其他酸兼容的数据库引擎,将刷新重做日志在事务提交之前。InnoDB
使用组织承诺将多个刷新请求分组在一起以避免每次提交一次刷新的功能。通过组提交,InnoDB
向日志文件发出一个写操作,以便对同时提交的多个用户事务执行提交操作,从而显著提高吞吐量。
当备份操作正在进行时,复制重做日志记录的备份工具有时可能无法跟上重做日志生成的速度,导致重做日志记录由于被覆盖而丢失。当备份操作期间MySQL服务器有大量活动,并且重做日志文件存储介质的运行速度比备份存储介质快时,最常发生此问题。在MySQL 8.0.17中引入的重做日志归档特性,通过将重做日志记录顺序写入除重做日志文件外的归档文件来解决这个问题。备份实用程序可以根据需要从存档文件复制重做日志记录,从而避免潜在的数据丢失。
如果服务器上配置了重做日志归档,MySQL企业备份,可在MySQL企业版,在备份MySQL服务器时使用重做日志归档特性。
在服务器上启用重做日志存档需要为innodb_redo_log_archive_dirs
系统变量。该值指定为一个以分号分隔的带标签的重做日志归档目录列表。的
对由冒号(标签:目录
:
)。例如:
mysql> SET GLOBAL innodb_redo_log_archive_dirs='label1:directory_path1(;label2:directory_path2;…]”;
的标签
是存档目录的任意标识符。它可以是任何字符串,冒号(:)除外,冒号是不允许的。也允许使用空标签,但在这种情况下仍然需要冒号(:)。一个directory_path
必须指定。激活重做日志归档时,为重做日志归档文件选择的目录必须存在,否则将返回错误。路径可以包含冒号(':'),但不允许使用分号(;)。
的innodb_redo_log_archive_dirs
变量必须在激活重做日志存档之前配置。默认值为零
,它不允许激活重做日志存档。
指定的归档目录必须满足以下要求。(当重做日志归档被激活时,这些要求被强制执行):
目录必须已经存在。目录不是由重做日志归档进程创建的。否则,将返回以下错误:
ERROR 3844 (HY000):重做日志存档目录'
directory_path1
'不存在或不是目录目录不能是全世界都可以访问的。这是为了防止重做日志数据暴露给系统上未经授权的用户。否则,将返回以下错误:
ERROR 3846 (HY000):重做日志归档目录'
directory_path1
所有操作系统用户都可以访问定义的目录不能为
datadir
,innodb_data_home_dir
,innodb_directories
,innodb_log_group_home_dir
,innodb_temp_tablespaces_dir
,innodb_tmpdir
innodb_undo_directory
,或secure_file_priv
,也不能是这些目录的父目录或子目录。否则,返回类似如下的错误:ERROR 3845 (HY000):重做日志归档目录'
directory_path1
'datadir' - '/ / data_directory /路径
”
当支持重做日志归档的备份实用程序启动备份时,备份实用程序通过调用innodb_redo_log_archive_start ()
用户定义的函数。
如果你没有使用支持重做日志存档的备份工具,重做日志存档也可以手动激活,如下所示:
SELECT innodb_redo_log_archive_start('标签”、“子目录”);+------------------------------------------+ | innodb_redo_log_archive_start ('标签') | +------------------------------------------+ | 0 | +------------------------------------------+
或者:
mysql> DO innodb_redo_log_archive_start('标签”、“子目录”);查询OK, 0行受影响(0.09秒)
激活重做日志存档的MySQL会话(使用innodb_redo_log_archive_start ()
)必须在存档期间保持打开。同一会话必须停用重做日志归档(使用innodb_redo_log_archive_stop ()
)。如果会话在重做日志归档显式停用之前终止,服务器隐式停用重做日志归档并删除重做日志归档文件。
在哪里标签
标签是由什么定义的innodb_redo_log_archive_dirs
;子目录
是可选参数,用于指定由?标识的目录的子目录标签
用于保存存档文件;必须是一个简单的目录名(不允许使用斜杠(/)、反斜杠(\)或冒号(:))。子目录
可以为空、null,也可以不使用。
只有具有INNODB_REDO_LOG_ARCHIVE
特权可以通过调用激活重做日志归档innodb_redo_log_archive_start ()
,或停用它使用innodb_redo_log_archive_stop ()
.运行备份工具的MySQL用户或手动激活和取消重做日志归档的MySQL用户必须具有此权限。
重做日志归档文件路径为
,在那里directory_identified_by_label
/ (子目录
/)存档。serverUUID
.000001.log
存档目录是否由directory_identified_by_label
理由标签
innodb_redo_log_archive_start ()
.
可选参数是否用于子目录
innodb_redo_log_archive_start ()
.
例如,重做日志归档文件的完整路径和名称如下所示:
/directory_path/子目录/ archive.e71a47dc - 61 - f8 - 11 - e9 a3cb b4d.000001.log——080027154
在备份实用程序完成复制之后InnoDB
数据文件,它通过调用innodb_redo_log_archive_stop ()
用户定义的函数。
如果您没有使用支持重做日志归档的备份实用程序,也可以手动禁用重做日志归档,如下所示:
SELECT innodb_redo_log_archive_stop();+--------------------------------+ | innodb_redo_log_archive_stop () | +--------------------------------+ | 0 | +--------------------------------+
或者:
mysql> DO innodb_redo_log_archive_stop();查询OK, 0行受影响(0.01秒)
在stop函数成功完成后,备份实用程序从存档文件中查找重做日志数据的相关部分,并将其复制到备份中。
当备份工具完成重做日志数据的复制并且不再需要重做日志归档文件时,它会删除归档文件。
在正常情况下,删除存档文件是备份实用程序的责任。但是,如果重做日志归档操作之前意外退出innodb_redo_log_archive_stop ()
调用时,MySQL服务器删除该文件。
性能考虑
由于额外的写活动,激活重做日志归档通常具有较小的性能成本。
在Unix和类Unix操作系统上,性能影响通常很小,假设没有持续的高更新率。在Windows上,性能影响通常略高一些,假设情况相同。
如果有持续的高更新速率,并且重做日志归档文件与重做日志文件位于相同的存储介质上,由于复合写活动,性能影响可能会更大。
如果有一个持续的高更新速率,重做日志归档文件在比重做日志文件更慢的存储介质上,性能会受到任意的影响。
写入重做日志归档文件不会妨碍正常的事务性日志记录,除非重做日志归档文件存储介质的运行速度比重做日志存储介质慢得多,并且有大量的持久化重做日志块等待写入重做日志归档文件。在这种情况下,事务性日志记录速率被降低到可以由重做日志存档文件所在的较慢的存储媒体管理的水平。
从MySQL 8.0.21开始,你可以使用修改实例关闭innodb redo_log
声明。此功能用于将数据加载到新的MySQL实例中。禁用重做日志可以通过避免重做日志写入和doubwrite缓冲来加速数据加载。
此特性仅用于将数据加载到新的MySQL实例中。不要在生产系统上禁用重做日志。允许在禁用重做日志时关闭和重启服务器,但是禁用重做日志时意外的服务器停止会导致数据丢失和实例损坏。
当重做日志被禁用时,试图在服务器意外停止后重新启动服务器被拒绝,报错如下:
[ERROR] [MY-013578] [InnoDB] Server was killed when InnoDB Redo logging was disabled。数据文件可能被损坏。您可以尝试使用innodb_force_recovery=6重新启动数据库
在这种情况下,初始化一个新的MySQL实例并再次启动数据加载过程。
的INNODB_REDO_LOG_ENABLE
启用和禁用重做日志需要特权。
的Innodb_redo_log_enabled
状态变量允许监控重做日志的状态。
当重做日志被禁用时,克隆操作和重做日志归档是不允许的,反之亦然。
一个Alter instance [enable | disable] innodb redo_log
操作需要一个排他性备份元数据锁改变实例
来自并发执行的操作。其他改变实例
操作在执行之前必须等待锁被释放。
下面的过程演示了如何在将数据加载到新的MySQL实例时禁用重做日志。
在新的MySQL实例上,授予
INNODB_REDO_LOG_ENABLE
负责禁用重做日志的用户帐户的权限。mysql>授予INNODB_REDO_LOG_ENABLE ON **到'data_load_admin';
随着
data_load_admin
用户,禁用重做日志:禁用INNODB的REDO_LOG
检查
Innodb_redo_log_enabled
状态变量,以确保重做日志被禁用。显示Innodb_redo_log_enabled全局状态+-------------------------+-------+ | Variable_name |值 | +-------------------------+-------+ | Innodb_redo_log_enabled |关闭 | +-------------------------+-------+
执行数据加载操作。
随着
data_load_admin
用户,在数据加载操作完成后启用重做日志:启用INNODB REDO_LOG
检查
Innodb_redo_log_enabled
确保重做日志被启用的状态变量。显示Innodb_redo_log_enabled全局状态+-------------------------+-------+ | Variable_name |值 | +-------------------------+-------+ | Innodb_redo_log_enabled |上 | +-------------------------+-------+