MySQL8.0特性之redo logging动态开关

2020-09-21 15:22:37 浏览数 (1)

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操作;

0 人点赞