MySQL 8.0.17新特性-Redo日志归档功能

169 阅读6分钟

功能作用: 在备份操作进行期间,复制重做日志记录的备份实用程序有时可能无法跟上重做日志生成的步伐,从而导致由于这些记录被覆盖而丢失重做日志记录。当备份操作期间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;…]';

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

在激活重做日志归档之前,必须配置innodb_redo_log_archive_dirs变量。默认值为NULL,这不允许激活重做日志存档。 (root@MySQL-8.0.25)[(none)]> show variables like '%archive%'; +------------------------------+-------+ | Variable_name | Value | +------------------------------+-------+ | innodb_redo_log_archive_dirs | | +------------------------------+-------+ 1 row in set (0.01 sec)

限制条件: 您指定的存档目录必须满足以下要求。(当激活重做日志归档时,会强制执行这些要求。): 目录必须存在。目录不是由重做日志存档过程创建的。否则,将返回以下错误: 错误3844(HY000):重做日志存档目录“directory_path1”不存在或不是目录

目录不能在系统所有用户范围内访问。这是为了防止重做日志数据暴露给系统上未经授权的用户。否则,将返回以下错误: 错误3846(HY000):所有操作系统用户都可以访问重做日志存档目录“directory_path1”

目录不能是由datadir、innodb_data_home_dir、innodd_Directories、innodl_log_group_home_dirinnodb_tmp_tablespaces_dir、innob_tmpdir innodb_undo_directory或secure_file_priv定义的目录,也不能是这些目录的父目录或子目录。否则,将返回类似于以下内容的错误: 错误3845(HY000):重做日志存档目录“directory_path1”位于服务器目录“datadir”中、之下或之上-“/path/to/data_directory”

#创建新的目录: #修改权限为mysql这个用户,并修改用户属性为700
[root@node200 lib]# mkdir -p /var/lib/innodb_redo_log_archive_dirs #创建根目录 [root@node200 lib]# chown mysql.mysql /var/lib/innodb_redo_log_archive_dirs/ [root@node200 lib]# chmod 700 /var/lib/innodb_redo_log_archive_dirs/
创建根目录下的子目录:redo_log [root@node200 lib]# mkdir -p /var/lib/innodb_redo_log_archive_dirs/redo_log [root@node200 innodb_redo_log_archive_dirs]# chmod 700 /var/lib/innodb_redo_log_archive_dirs/redo_log [root@node200 innodb_redo_log_archive_dirs]# chown mysql.mysql /var/lib/innodb_redo_log_archive_dirs/redo_log

动态设置主目录参数映射:

(root@MySQL-8.0.25)[(none)]> set global innodb_redo_log_archive_dirs='tmp_redo_dir:/var/lib/innodb_redo_log_archive_dirs/'; Query OK, 0 rows affected (0.01 sec)

启动归档: MySQL8版本中新增了一个INNODB_REDO_LOG_ARCHIVE权限,由于root用户没有INNODB_REDO_LOG_ARCHIVE权限,导致错误出现。 为root添加权限: (root@MySQL-8.0.25)[(none)]> grant INNODB_REDO_LOG_ARCHIVE on . to 'root'; Query OK, 0 rows affected (0.04 sec)

当支持重做日志归档的备份实用程序启动备份时,该备份实用程序通过调用innodb_redo_log_archive_start()用户定义函数来激活重做日志归档。 如果您没有使用支持重做日志归档的备份实用程序,也可以手动激活重做日志归档,如下所示: mysql> SELECT innodb_redo_log_archive_start('label', 'subdir'); +------------------------------------------+ | innodb_redo_log_archive_start('label') | +------------------------------------------+ | 0 | +------------------------------------------+ Or: mysql> DO innodb_redo_log_archive_start('label', 'subdir'); Query OK, 0 rows affected (0.09 sec)

(root@MySQL-8.0.25)[(none)]> do innodb_redo_log_archive_start('tmp_redo_dir','redo_log'); Query OK, 0 rows affected (0.35 sec)

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

其中,label是由innodb_redo_log_archive_dirs定义的标签;subdir是一个可选参数,用于指定由保存归档文件的标签标识的目录的子目录;它必须是一个简单的目录名(不允许使用斜线(/)、反斜线(\)或冒号(:))。subdir可以为空、null,也可以省略。

只有具有INNODB_REDO_LOG_ARCHIVE权限的用户才能通过调用INNODB_REDO_LOG_ARCHIVE_start()激活重做日志归档,或者使用INNODB_reado_LOG_archive_stop()将其停用。运行备份实用程序的MySQL用户或手动激活和停用重做日志归档的MySQL用户必须具有此权限。

重做日志存档文件路径为directory_identified_by_label/[subdr/]archive.serverUUID.0000001.log,其中directory_identified _by_label是由innodb_redo_log_archive_start()的label参数标识的存档目录。subdir是用于innodb_redo_log_archive_start()的可选参数。

查看生成的归档文件: 例如,重做日志存档文件的完整路径和名称与以下内容类似: /directory_path/subdirectory/archive.e71a47dc-61f8-11e9-a3cb-080027154b4d.000001.log

[root@node200 redo_log]# pwd /var/lib/innodb_redo_log_archive_dirs/redo_log [root@node200 redo_log]# ls archive.8612844f-c67a-11eb-80a4-000c29b8169f.000001.log

停止归档: 备份实用程序完成复制InnoDB数据文件后,通过调用InnoDB_redo_log_archive_stop()用户定义函数来停用重做日志归档。 如果您没有使用支持重做日志归档的备份实用程序,也可以手动停用重做日志归档,如图所示: mysql> SELECT innodb_redo_log_archive_stop(); +--------------------------------+ | innodb_redo_log_archive_stop() | +--------------------------------+ | 0 | +--------------------------------+ Or:

(root@MySQL-8.0.25)[(none)]> DO innodb_redo_log_archive_stop(); Query OK, 0 rows affected (0.02 sec)

停止功能成功完成后,备份实用程序会从归档文件中查找重做日志数据的相关部分,并将其复制到备份中。 备份实用程序完成复制重做日志数据并且不再需要重做日志存档文件后,将删除存档文件。 在正常情况下,删除存档文件是备份实用程序的责任。但是,如果重做日志归档操作在调用innodb_redo_log_archive_stop()之前意外退出,MySQL服务器将删除该文件。

性能注意事项 由于额外的写入活动,激活重做日志归档通常会带来较小的性能成本。 在Unix和类Unix操作系统上,假设没有持续的高更新率,对性能的影响通常很小。在Windows上,假设情况相同,性能影响通常会更高一些。 如果存在持续的高更新率,并且重做日志归档文件与重做日志文件位于同一存储介质上,则由于复杂的写入活动,性能影响可能会更大。 如果存在持续的高更新率,并且重做日志归档文件位于比重做日志文件慢的存储介质上,则性能会受到任意影响。 向重做日志存档文件写入不会妨碍正常的事务日志记录,除非重做日志归档文件存储介质的操作速度比重做日志文件存储介质慢得多,并且有大量的持久化重做日志块等待写入重做日志归档文件。在这种情况下,事务日志记录速率会降低到可以由重做日志归档文件所在的较慢存储介质管理的水平。

2023-03-31_162529.jpg