数据库处理机制中,Redo日志用于确保数据持久性与一致性,并且提高数据库恢复能力。在MySQL中Redo文件是循环使用的,当Redo日志填满时,会采取覆盖写入。当发生故障,需要用到Redo进行恢复时,因为缺失覆盖掉的Redo日志,无法恢复。如存在归档Redo日志,就可以通过归档Redo日志进行恢复。按照官方说明,归档Redo目前配合mysqlbackup(企业版备份工具)结合使用。备份操作期间,Redo写入时间比备份时间大时,Redo日志归档功能将启动后台线将Redo日志记录顺序写入归档文件中,来解决此备份失败问题。
Redo归档设置
启用Redo日志归档需要为innodb_redo_log_archive_dirs参数设置值。
1.设置和查看方式
#my.cnf配置:
innodb_redo_log_archive_dirs=arch1:/redo_archive/arch1;arch2:/redo_archive/arch2
#命令行设置:
SET GLOBAL innodb_redo_log_archive_dirs=arch1:/redo_archive/arch1;arch2:/redo_archive/arch2
#查看设置:
mysql > show variables like '%redo%';
+------------------------------+--------------------------------------------+
| Variable_name | Value |
+------------------------------+--------------------------------------------+
| innodb_redo_log_archive_dirs | arch1:/redo_archive/arch1;
arch2:/redo_archive/arch2 |
| innodb_redo_log_capacity | 104857600 |
| innodb_redo_log_encrypt | OFF |
+------------------------------+--------------------------------------------+
3 rows in set (0.0047 sec)
2.Redo归档设置和使用当中注意事项.
- 目录必须存在:
ERROR 3846 (HY000): Redo log archive directory 'redo_archive' is accessible to all OS users
- 目录不能所有访问:
ERROR 3846 (HY000): Redo log archive directory '/redo_archive/arch1' is accessible to all OS users
- 文件目录权限必须需要700,权限设置如下:
```language
chmod 700 /redo_archiv/arch1 /redo_archiv/arch2
- 目录不能是由datadir,innodb_data_home_dir等,也不能是这些目录的父目录或子目录:
ERROR 3845 (HY000): Redo log archive directory 'directory_path1' is in, under, or over server directory 'datadir' - '/path/to/data_directory'
- mysqlbackup备份时,无法使用root账号:
WARNING: MySQL query 'DO innodb_redo_log_archive_start('arch1','20241113');': 3847, Cannot create redo log archive file '/redo_archive/arch1/17313911639993745/archive.442f4c85-9825-11ef-8da0-00163e23e2cc.000001.log' (OS errno: 13 - Permission denied)
3.对于归档Redo日志监控。
可以通过采集器配置项进行查看。默认是打开的。
- 归档Redo配置项如下所示:
mysql> SELECT NAME,ENABLED,TIMED,PROPERTIES
FROM performance_schema.setup_instruments where name like '%redo%';
+------------------------------------------------+---------+-------+------------+
| NAME | ENABLED | TIMED | PROPERTIES |
+------------------------------------------------+---------+-------+------------+
| wait/io/file/innodb/meb::redo_log_archive_file | YES | YES | |
| stage/innodb/clone (redo copy) | YES | YES | progress |
+------------------------------------------------+---------+-------+------------+
- 是否运行Redo归档,可通过系统threads表进行查看:
mysql> SELECT thread_id, name, type
FROM performance_schema.threads WHERE name like '%redo_log_archive%';
+-----------+-----------------------------------------------------+------------+
| thread_id | name | type |
+-----------+-----------------------------------------------------+------------+
| 59 | thread/innodb/meb::redo_log_archive_consumer_thread | BACKGROUND |
+-----------+-----------------------------------------------------+------------+
1 row in set (0.00 sec)
- Redo归档日志内容file_instances表进行查看:
mysql> SELECT * FROM performance_schema.file_instances
WHERE event_name like '%::redo_log_archive_file'\G
*************************** 1. row ***************************
FILE_NAME: /redo_archive/arch1/17313914361335647/archive.442f4c85-9825-11ef-8da0-00163e23e2cc.000001.log
EVENT_NAME: wait/io/file/innodb/meb::redo_log_archive_file
OPEN_COUNT: 1
*************************** 2. row ***************************
FILE_NAME: /redo_archive/arch1/17313915135239748/archive.442f4c85-9825-11ef-8da0-00163e23e2cc.000001.log
EVENT_NAME: wait/io/file/innodb/meb::redo_log_archive_file
OPEN_COUNT: 1
2 rows in set (0.00 sec)
按照mysqlbackup 验证Redo功能验证
通过mysqlbakcup和general日志查看具体执行的命令:
shell> mysqlbackup --defaults-file=/etc/my9.0.cnf -uroot -p******
--backup-dir=/opt/backup1/backup-tmp backup --number-of-buffers=100M
mysqlbackup默认检查Redo情况,是否开始,大小,创建归档日志:

general日志启动归档Redo日志:

手动归档
1.手动创建Redo归档根目录:
[mysql@arch1]$ mkdir -p 20241113
drwxrwxr-x 2 mysql mysql 6 Nov 13 14:07 20241113
2.手动赋予权限720
[mysql@arch1]$ chmod 720 20241113/
[mysql@arch1]$ ll
total 0
drwx-w---- 2 mysql mysql 6 Nov 13 14:07 20241113
3.启动归档Redo
通过调用innodb_redo_log_archive_start()函数激活重做日志归档。传递’label’名和子目录名需要跟上面【20241113】对齐:
mysql> SELECT innodb_redo_log_archive_start('arch1','20241113');
+---------------------------------------------------+
| innodb_redo_log_archive_start('arch1','20241113') |
+---------------------------------------------------+
| 0 |
+---------------------------------------------------+
1 row in set (0.05 sec)
验证Redo归档是否生效:
执行操作目前设置redo大小的大事务。查看归档Redo生成的文件。大小在变化。
shell$ ll
total 4
-r--r----- 1 mysql mysql 4096 Nov 13 14:12 archive.442f4c85-9825-11ef-8da0-00163e23e2cc.000001.log
shell$ ll
total 20
-r--r----- 1 mysql mysql 20480 Nov 13 14:17 archive.442f4c85-9825-11ef-8da0-00163e23e2cc.000001.log
shell$ ll
total 16384
-r--r----- 1 mysql mysql 11014144 Nov 13 14:17 archive.442f4c85-9825-11ef-8da0-00163e23e2cc.000001.log
shell$ ll
total 16384
-r--r----- 1 mysql mysql 11018240 Nov 13 14:18 archive.442f4c85-9825-11ef-8da0-00163e23e2cc.000001.log
。。。
通过Linux ps线程显示,归档Redo采取后台使用ib_meb_rl线程
[root@schouse bin]# ps -Lp 1875075 -o tid,cmd,comm
TID CMD COMMAND
。。。
1899304 /opt/idc/mysql9.0/bin/mysql ib_meb_rl
3.停止归档Redo
通过调用InnoDB_redo_log_archive_stop()函数来停用重做日志归档。
mysql> SELECT innodb_redo_log_archive_stop();
+--------------------------------+
| innodb_redo_log_archive_stop() |
+--------------------------------+
| 0 |
+--------------------------------+
之后就可以利用归档Redo做数据恢复之用。不过,相应的官方接口或工具还没开放出来。只能拭目以待。
总结
归档Redo功能是MySQL 8.0.17版本发布的,最新版本目前已经到8.0.40,9.1版本, 因为没有对外开放归档文件使用功能,无法在实际环境中使用。
归档Redo功能是创建新文件顺序写入,因此整体影响很小。目前只有MySQL企业版备份工具具备归档Redo的支持。希望官方开放出使用归档Redo的接口,也希望Percona Xtrabackup支持,这样MySQL又多了一个数据恢复的手段。




