• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • 重做日志

    重做日志是基于磁盘的数据结构,在崩溃恢复期间用于纠正不完整事务写入的数据。在正常操作期间,重做日志对更改表数据的请求进行编码,这些请求是由SQL语句或低级API调用引起的。在初始化过程中以及接受连接之前,将自动重播在意外关闭之前未完成更新数据文件的修改。有关重做日志在崩溃恢复中的作用的信息,请参见“ InnoDB恢复”。

    默认情况下,重做日志在磁盘上由两个名为ib_logfile0和的文件物理表示ib_logfile1。MySQL以循环方式写入重做日志文件。重做日志中的数据按照受影响的记录进行编码;此数据统称为重做。通过重做日志的数据传递以不断增加的LSN值表示。

    有关相关信息,请参阅重做日志文件配置和“优化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事务管理”。

    重做日志归档

    在执行备份操作时,复制重做日志记录的备份实用程序有时可能无法跟上重做日志生成的步伐,由于这些记录被覆盖,导致丢失重做日志记录。当备份操作期间有大量MySQL服务器活动并且重做日志文件存储介质的运行速度比备份存储介质快时,通常会发生此问题。MySQL 8.0.17中引入的重做日志归档功能,通过将重做日志记录顺序地写入重做日志文件之外,还通过将重做日志记录顺序写入存档文件来解决此问题。备份实用程序可以根据需要从存档文件复制重做日志记录,从而避免潜在的数据丢失。

    如果在服务器上配置了重做日志归档,则MySQL Enterprise Edition随附的 MySQL Enterprise Backup在备份MySQL服务器时使用重做日志归档功能。

    在服务器上启用重做日志归档需要为innodb_redo_log_archive_dirs系统变量设置一个值。该值被指定为带标签的重做日志归档目录的分号分隔列表。该label:directory对之间用冒号(:)分隔。例如:

    mysql> SET GLOBAL innodb_redo_log_archive_dirs='label1:directory_path1[;label2:directory_path2;…]';
    

    label是存档目录中的任意标识符。它可以是任何字符串,但不能使用冒号(:)。也可以使用空标签,但在这种情况下仍需要使用冒号(:)。一个directory_path必须指定。激活重做日志归档或返回错误时,必须为重做日志归档文件选择的目录存在。该路径可以包含冒号(':'),但不允许使用分号(;)。

    innodb_redo_log_archive_dirs之前的重做日志归档可以激活变量必须配置。默认值为NULL,不允许激活重做日志归档。

    注意

    您指定的归档目录必须满足以下要求。(激活重做日志归档后,将强制执行这些要求。):

    • 目录必须存在。目录不是由重做日志归档过程创建的。否则,返回以下错误:

      错误3844(HY000):重做日志归档目录'directory_path1'不存在或不是目录

    • 目录不能在世界范围内访问。这是为了防止重做日志数据暴露给系统上未经授权的用户。否则,返回以下错误:

      错误3846(HY000):directory_path1所有操作系统用户均可访问重做日志归档目录''

    • 目录不能被那些由定义datadirinnodb_data_home_dirinnodb_directoriesinnodb_log_group_home_dirinnodb_temp_tablespaces_dir,,或,也不能是父目录或这些目录的子目录。否则,将返回类似于以下内容的错误:innodb_tmpdirinnodb_undo_directorysecure_file_priv

      错误3845(HY000):重做日志归档目录“directory_path1”位于服务器目录“ datadir”中,之下或上方-“/path/to/data_directory

    当支持重做日志归档的备份实用程序启动备份时,该备份实用程序通过调用innodb_redo_log_archive_start()用户定义的功能来激活重做日志归档。

    如果未使用支持重做日志归档的备份实用程序,则也可以手动激活重做日志归档,如下所示:

    mysql> SELECT innodb_redo_log_archive_start('label', 'subdir');
    +------------------------------------------	+
    
    | innodb_redo_log_archive_start('label')|
    +------------------------------------------	+
    | 0                                        	|
    +------------------------------------------	+
    

    要么:

    mysql> DO innodb_redo_log_archive_start('label', 'subdir');
    Query OK, 0 rows affected (0.09 sec)
    
    注意

    激活重做日志归档(使用innodb_redo_log_archive_start())的MySQL会话必须在归档期间保持打开状态。同一会话必须停用重做日志归档(使用innodb_redo_log_archive_stop())。如果会话在显式停用重做日志归档之前终止,则服务器会隐式停用重做日志归档并删除重做日志归档文件。

    label标签在哪里定义innodb_redo_log_archive_dirssubdir是可选参数,用于指定label用于保存归档文件的目录的子目录;它必须是一个简单的目录名称(不允许使用斜杠(/),反斜杠(\)或冒号(:))。subdir可以为空,null或可以不包含。

    只有具有INNODB_REDO_LOG_ARCHIVE特权的用户才能通过调用来激活重做日志归档innodb_redo_log_archive_start(),或使用来取消激活它innodb_redo_log_archive_stop()。运行备份实用程序的MySQL用户或手动激活和停用重做日志归档的MySQL用户必须具有此特权。

    重做日志存档文件路径为,其中是参数标识的存档目录。是用于的可选参数。directory_identified_by_label/[subdir/]archive.serverUUID.000001.logdirectory_identified_by_labellabelinnodb_redo_log_archive_start()subdirinnodb_redo_log_archive_start()

    例如,重做日志归档文件的完整路径和名称看起来类似于以下内容:

    /directory_path/subdirectory/archive.e71a47dc-61f8-11e9-a3cb-080027154b4d.000001.log
    

    备份实用程序完成InnoDB数据文件的复制后,它将通过调用innodb_redo_log_archive_stop()用户定义的函数来取消重做日志归档。

    如果未使用支持重做日志归档的备份实用程序,则也可以手动停用重做日志归档,如下所示:

    mysql> SELECT innodb_redo_log_archive_stop();
    +--------------------------------	+
    | innodb_redo_log_archive_stop() 	|
    +--------------------------------	+
    | 0                              	|
    +--------------------------------	+
    

    要么:

    mysql> DO innodb_redo_log_archive_stop();
    Query OK, 0 rows affected (0.01 sec)
    

    停止功能成功完成后,备份实用程序将从存档文件中查找重做日志数据的相关部分,并将其复制到备份中。

    备份实用程序完成复制重做日志数据并且不再需要重做日志存档文件后,它将删除存档文件。

    在正常情况下,备份实用程序负责删除存档文件。但是,如果重做日志归档操作在innodb_redo_log_archive_stop()调用前意外退出,则MySQL服务器会删除该文件。

    性能考量

    由于额外的写入活动,因此激活重做日志归档通常会降低性能成本。

    在Unix和类似Unix的操作系统上,假设没有持续的高更新率,对性能的影响通常很小。在Windows上,假设相同,则对性能的影响通常会更高。

    如果持续保持较高的更新速度,并且重做日志存档文件与重做日志文件位于同一存储介质上,则由于混合的写入活动,对性能的影响可能会更大。

    如果持续保持较高的更新速度,并且重做日志存档文件位于比重做日志文件慢的存储介质上,则性能会受到任意影响。

    写入重做日志归档文件不会妨碍正常的事务日志记录,除非重做日志归档文件存储介质的运行速度比重做日志文件存储介质慢得多,并且存在大量积压的持久化重做日志块等待写入重做日志归档文件。在这种情况下,事务日志记录速率降低到可以由重做日志存档文件所在的较慢的存储介质管理的级别。