关闭 InnoDB 的 redo log

在 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%的时间。

参考文档

Leave a Reply

Your email address will not be published. Required fields are marked *