MySQL8.0特性之redo logging动态开关
我们知道MySQL是采用WAL技术实现事务的持久性的,所谓的WAL技术是指在写磁盘前先写log,保证在MySQL服务器crash之后,通过redo log来数据找回来。要通过redo log来找到未写入磁盘的数据,则需要将redo log落盘,在Innodb中通过ib_logfile文件组来控制redo log的个数以及大小。
在MySQL8.0.21版本中,MySQL引入了redo logging的开关,首先解释下为什么需要这个开关,我个人理解是在某些导入数据的场景下,需要关闭redo log来增加导入的效率,如果不关闭redo log,那么对于数据页的所有变更,都会写入redo log,可能会影响效率。在MySQL5.7版本中,导入数据的时候,为了提高效率,通常情况下会将"双1模式"打破,常见做法是flush_logs_at_trx_commit参数设置为2,而将sync_binlog参数设置为一个较大的值,减少磁盘的刷盘频率。在MySQL8.0.21中可以通过关闭redo log来使得相关事务可以跳过记录redo日志和doublewrite buffer,从而加快数据导入的速度。但与此同时,这种做法损坏了事务的ACID特性。
开启或者关闭redo log的语法是:
ALTER INSTANCE DISABLE INNODB REDO_LOG
ALTER INSTANCE ENABLE INNODB REDO_LOG
除此之外,开启或者关闭redo log还需要INNODB_REDO_LOG_ENABLE这个权限,可以通过下面的参数来查看redo log的状态:
mysql> SHOW GLOBAL STATUS LIKE 'Innodb_redo_log_enabled';
+-------------------------+-------+
| Variable_name | Value |
+-------------------------+-------+
| Innodb_redo_log_enabled | OFF |
+-------------------------+-------+
在导入数据的场景下,正确的操作步骤是:
1、关闭innodb 的redo log
2、检查redo log状态,确认已经关闭
3、导数据
4、开启innodb 的redo log
5、检查redo log状态,确认已经关闭
使用该特性,有以下几点注意事项: