MySQL8.0特性之redo logging动态开关
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状态,确认已经关闭
使用该特性,有以下几点注意事项:
- 该特性仅用于新实例导入数据场景,尽量避免用于线上的生产环境;
- 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操作;
- MySQL 教程
- MySQL 安装
- MySQL 管理与配置
- MySQL PHP 语法
- MySQL 连接
- MySQL 创建数据库
- MySQL 删除数据库
- MySQL 选择数据库
- MySQL 数据类型
- MySQL 创建数据表
- MySQL 删除数据表
- MySQL 插入数据
- MySQL 查询数据
- MySQL where 子句
- MySQL UPDATE 查询
- MySQL DELETE 语句
- MySQL LIKE 子句
- mysql order by
- Mysql Join的使用
- MySQL NULL 值处理
- MySQL 正则表达式
- MySQL 事务
- MySQL ALTER命令
- MySQL 索引
- MySQL 临时表
- MySQL 复制表
- 查看MySQL 元数据
- MySQL 序列 AUTO_INCREMENT
- MySQL 处理重复数据
- MySQL 及 SQL 注入
- MySQL 导出数据
- MySQL 导入数据
- MYSQL 函数大全
- MySQL Group By 实例讲解
- MySQL Max()函数实例讲解
- mysql count函数实例
- MYSQL UNION和UNION ALL实例
- MySQL IN 用法
- MySQL between and 实例讲解
- Linux文本处理详细教程
- 使用LDheatmap快速绘制SNP连锁不平衡图
- Ubuntu nfs配置
- window.showModalDialog()用法
- Ubuntu 文件同步工具 rsync
- DB2导入数据库
- 我是这么以非root安装R语言和相关packages的
- Vuex详细教程
- 线程池submit和execute,搞不好会引发线上故障
- Window open使用教程
- kafka发送客户端在高并发场景下如何保证不频繁GC的
- 几个小细节帮你提升java代码运行效率
- spring data操作ES简直不能再香
- 国防科大提出基于可变形三维卷积(D3Dnet)的视频超分辨,代码已开源
- 不要被kafka的异步模式欺骗了