在 MySQL 实例恢复时(尤其是逻辑备份的恢复),为了获得更快的恢复速度,通常会关闭二进制日志(Binary Log),并且将 InnoDB 的日志持久化级别调整到最低。从 MySQL 8.0.21起[1],更进一步的,可以彻底的关闭 InnoDB redo 从而获得更好导入速度。后续的 8.4 / 9.0 / 9.1 可以使用该特性。
在本文的测试中,可以看到关闭 InnoDB redo log 导入速度可以提升约 26%。
使用场景
最为常见的就是在进行大量数据导入时,希望能够加速数据导入的过程。
管理命令
可以使用如下的命令关闭/或打开 InnoDB redo log:
ALTER INSTANCE {ENABLE|DISABLE} INNODB REDO_LOG
关闭 InnoDB redo log
mysql> ALTER INSTANCE DISABLE INNODB REDO_LOG;
Query OK, 0 rows affected (0.00 sec)
mysql> SHOW STATUS LIKE '%Innodb_redo_log_enabled%';
+-------------------------+-------+
| Variable_name | Value |
+-------------------------+-------+
| Innodb_redo_log_enabled | OFF |
+-------------------------+-------+
1 row in set (0.02 sec)
打开 InnoDB redo log
mysql> ALTER INSTANCE ENABLE INNODB REDO_LOG;
Query OK, 0 rows affected (1.02 sec)
mysql> SHOW STATUS LIKE '%Innodb_redo_log_enabled%';
+-------------------------+-------+
| Variable_name | Value |
+-------------------------+-------+
| Innodb_redo_log_enabled | ON |
+-------------------------+-------+
1 row in set (0.00 sec)
执行该命令的权限
因为该命令对数据库影响巨大,所以也引入独立的权限 INNODB_REDO_LOG_ENABLE
来管理该命令的执行权限。具体参考:
mysql> GRANT INNODB_REDO_LOG_ENABLE ON *.* to 'data_load_admin';
性能对比
这里做应该简单的性能对比,看看关闭 InnoDB Redo Log 导入速度会提升多少。
# mysql -uroot test -e "show status like 'Innodb_redo_log_enabled'"
+-------------------------+-------+
| Variable_name | Value |
+-------------------------+-------+
| Innodb_redo_log_enabled | ON |
+-------------------------+-------+
# mysql -uroot test -e "truncate table passenger"
# time mysql -uroot test < passenger.1000.sql > /dev/null
real 0m3.109s
user 0m0.017s
sys 0m0.013s
# mysql -uroot test -e "truncate table passenger"
# mysql -uroot test -e "ALTER INSTANCE DISABLE INNODB REDO_LOG"
# time mysql -uroot test < passenger.1000.sql > /dev/null
real 0m2.286s
user 0m0.022s
sys 0m0.009s
在这个初步测试中,可以观察到,在关闭 InnoDB Redo 之后,到如时间从 3.109s 降低到了 2.286s,在该导入中,节省时间约 26%的时间。
参考文档