一 前言
前几天有客户测试使用云数据库的时候提出 要禁止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.?
既然官方说了不建议在生产库使用,我们就学习一下吧,万一以后用的着呢。。
为了支持 redo logging 开关功能 ,MySQL 增加新的 SQL语法:
ALTER INSTANCE {ENABLE/DISABLE } INNODB REDO_LOG。
具备 INNODB_REDO_LOG_ENABLE
权限的用户,才能被允许执行 Redo Logging 动态开关的操作,所以如果需要禁用该操作,可以通过控制用户的权限,云数据库实例应该不会开放该权限,但是自建的数据库的 具有super权限的用户就不好控制了。
新增状态值 Innodb_redo_log_enabled
,用于显示当前 Redo Logging 开关状态。
为用户赋权
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';
开关 Redo Logging 执行过程中获取 排他模式的 backup metadata lock,故不支持其他并发的 ALTER INSTANCE 操作;
Redo logging关闭状态下,不支持cloning operations和redo log archiving这两个功能;
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 导入数据时,加上了上面的参数,导致了一些列的故障。
学习新技术,用不好的话, 也不是什么好事儿。 have fun with your MySQL instance