我们知道,在MySQL中,redo log是一个文件组,一般是3个文件,循环写入,写满的时候会做redo log层面的checkpoint,然后覆盖之前的redo log;而binlog是有归档功能的,每个binlog写满之后,都会重新开启下一个binlog开始写入,这也是为什么可以使用binlog来进行数据恢复的一个原因,就是因为它的归档功能。
MySQL8.0.17中引入了redo log的归档功能,如果我们开启归档功能,redo log会持续不断的生成,而不会覆盖掉之前的redo log。这个功能主要在哪种场景下应用呢?
试想这样一种情况,在对一个高并发的数据库进行备份的时候,备份速度很慢而redo log生成的速度很快,备份的速度跟不上redo log的生成速度,导致redo log被覆盖了,此时备份的一致性就无法得到保证了。有了redo log的归档功能,就可以在备份启动的时候同步启动redo log 归档,而在备份结束的时候同步停止redo log归档,这样就可以避免这个备份的问题了。备份结束之后,依旧可以利用这个期间产生的redo log进行数据恢复。
redo log归档功能的启用方法是设置innodb_redo_log_archive_dirs参数,该参数支持动态修改,可以使用set global + 参数的方法进行修改。
mysql--dba_admin@127.0.0.1:(none) 23:32:01>>show variables like '%archive%';
+------------------------------+-------+
| Variable_name | Value |
+------------------------------+-------+
| innodb_redo_log_archive_dirs | |
+------------------------------+-------+
1 row in set (0.00 sec)
redo log的归档路径有如下限制:
1、目录必须存在,而且其他用户不可访问,最好是700的权限模式
2、该用户目录不能和datadir、innodb_tmpdir、以及其他mysqld的运行目录重合,需要单独创建
开启redo log的归档的过程:
# 动态设置参数
mysql >>set global innodb_redo_log_archive_dirs='tmp_redo_dir:
/tmp' ;
Query OK, 0 rows affected (0.00 sec)
# 创建redo log文件组,发现权限不够,需要INNODB_REDO_LOG_ARCHIVE 权限
mysql >>do innodb_redo_log_archive_start('tmp_redo_dir','2020071
3');
ERROR 1227 (42000): Access denied; you need (at least one of) the INNODB_REDO_LOG_ARCHIVE privilege(s) for this operation
# 不创建目录的情况下,MySQL提示目录不存在
mysql >>do innodb_redo_log_archive_start('tmp_redo_dir','20200713');
ERROR 3844 (HY000): Redo log archive directory '/tmp/20200713' does not exist or is not a directory
# 创建目录,MySQL发现目录权限过大,对所有user可见
mysql >>system mkdir /tmp/20200713
mysql >>do innodb_redo_log_archive_start('tmp_redo_dir','20200713')
;
ERROR 3846 (HY000): Redo log archive directory '/tmp/20200713' is accessible to all OS users
# 修改权限为mysql这个用户,并修改用户属性为700
sudo chown -R mysql.mysql /tmp/20200713
mysql >>system chmod 700 /tmp/20200713
mysql >>do innodb_redo_log_archive_start('tmp_redo_dir','20200713') ;
Query OK, 0 rows affected (0.07 sec)
# 查看生成的redo log文件
mysql >>system sudo ls -l /tmp/20200713
total 0
-r--r----- 1 mysql mysql 0 Jul 13 23:42 archive.ff33ed53-94cc-11ea-9a62-005056b71124.000001.log
其中参数tmp_redo_dir表示路径,20200713表示子路径。
一般情况下,redo log的归档功能,对性能的影响比较小,在高并发事务场景下,可能对性能的影响会有点大。具体数据有待测试。