MySQL 8.0 开关 Redo Logging

一 前言

前几天有客户测试使用云数据库的时候提出 要禁止mydumper 关闭redo log的操作 (说白了就是导入数据时保持MySQL 实例的redo logging功能), 这才想起 在 MySQL 8.0.21 版本中,开启了一个新特性 “Redo Logging 动态开关”

在新实例导数据的场景下,通过关闭 redo logging ,写入操作的事务可以跳过记录 redo日志和 doublewrite buffer,从而加快导入数据的速度。但是也有负面作用付出的代价是短时间牺牲了数据库的ACID保障。

官方文档特别强调该功能不能使用在生产环境,仅仅用于新实例的加速 数据导入,不知道客户之前经历了什么,特别强调支不支持禁用这个功能。

官方文档如是说:

As of MySQL 8.0.21, you can disable redo logging using the 
ALTER INSTANCE DISABLE INNODB REDO_LOG statement. 
This functionality is intended for loading data into a new MySQL instance. 

既然官方说了不建议在生产库使用,我们就学习一下吧,万一以后用的着呢。。

二 介绍

2.1

为了支持 redo logging 开关功能 ,MySQL 增加新的 SQL语法:

ALTER INSTANCE {ENABLE/DISABLE } INNODB REDO_LOG。

具备 INNODB_REDO_LOG_ENABLE 权限的用户,才能被允许执行 Redo Logging 动态开关的操作,所以如果需要禁用该操作,可以通过控制用户的权限,云数据库实例应该不会开放该权限,但是自建的数据库的 具有super权限的用户就不好控制了。

新增状态值 Innodb_redo_log_enabled ,用于显示当前 Redo Logging 开关状态。

2.2 纸上来得终觉浅

为用户赋权

GRANT INNODB_REDO_LOG_ENABLE ON . to the_bad_gay;

关闭redo logging

检查redo logging是否成功关闭

导数据

重新开启redo logging

ALTER INSTANCE ENABLE INNODB REDO_LOG;

确认redo logging状态

SHOW GLOBAL STATUS LIKE 'Innodb_redo_log_enabled';

2.3 使用限制
  1. 开关 Redo Logging 执行过程中获取 排他模式的 backup metadata lock,故不支持其他并发的 ALTER INSTANCE 操作;

  2. Redo logging关闭状态下,不支持cloning operations和redo log archiving这两个功能;

  3. 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.

三 总结:

写这篇文章的时候,搜集了一下 资料发现, mydumper 紧跟 MySQL 8.0 的技术发展,再新的版本中 增加了新的参数 --disable-redo-log Disables the REDO_LOG and enables it after, doesn't check initial status.

对于客户的诉求,我估计是有人在生产库使用 mydumper 导入数据时,加上了上面的参数,导致了一些列的故障。

MySQL 8.0 开关 Redo Logging_第1张图片

学习新技术,用不好的话, 也不是什么好事儿。 have fun with your MySQL instance

你可能感兴趣的:(mysql,数据库)