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的语法是:
代码语言:javascript复制ALTER INSTANCE DISABLE INNODB REDO_LOG
ALTER INSTANCE ENABLE INNODB REDO_LOG
除此之外,开启或者关闭redo log还需要INNODB_REDO_LOG_ENABLE这个权限,可以通过下面的参数来查看redo log的状态:
代码语言:javascript复制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状态,确认已经关闭
使用该特性,有以下几点注意事项:
- 该特性仅用于新实例导入数据场景,尽量避免用于线上的生产环境;
- Redo logging关闭状态下,支持正常流程的关闭和重启实例;但在异常宕机情况下,可能会导致丢数据和页面损坏;Redo logging关闭后异常宕机的实例需要废弃重建,直接重启会有如下报错:[ERROR] [MY-013578] [InnoDB] Server was killed when Innodb Redo logging was disabled. Data files could be corrupt. You can try to restart the database with innodb_force_recovery=6.
- Redo logging关闭状态下,不支持cloning operations和redo log archiving这两个功能;
- 执行过程中不支持其他并发的ALTER INSTANCE操作;