Mysql 数据库中的 redo log 和 binlog 写入策略


Posted in MySQL onApril 26, 2022

redo log的写入策略

InnoDB提供了innodb_flush_log_at_trx_commit参数,它有三种可能取值:

  • 设置为0的时候,表示每次事务提交时都只是把redo log留在redo log buffer中;
  • 设置为1的时候,表示每次事务提交时都将redo log直接持久化到磁盘;
  • 设置为2的时候,表示每次事务提交时都只是把redo log写到page cache

查看mysql变量:show VARIABLES LIKE 'innodb_flush_log_at_trx_commit'

binlog的写入策略

binlog的写入策略,write 和fsync的时机,是由参数sync_binlog控制的:

  • sync_binlog=0的时候,表示每次提交事务都只write,不fsync
  • sync_binlog=1的时候,表示每次提交事务都会执行fsync
  • sync_binlog=N(N>1)的时候,表示每次提交事务都write,但累积N个事务后才fsync

因此,在出现IO瓶颈的场景里,将sync_binlog设置成一个比较大的值,可以提升性能。在实际的业务场景中,考虑到丢失日志量的可控性,一般不建议将这个参数设成0,比较常见的是将其设置为100~1000中的某个数值。

但是,将sync_binlog设置为N,对应的风险是:如果主机发生异常重启,会丢失最近N个事务的binlog日志。

生产配置

通常情况下,生产都是" 双1 "的配置,也就是sync_binloginnodb_flush_log_at_trx_commit 的配置都是1,也就是说,一个事务完整提交前,需要等待两次刷盘,一次是redo log,一次是binlog

性能瓶颈

如果你的MySQL现在出现了性能瓶颈,而且瓶颈在IO上,可以通过哪些方法来提升性能呢?

针对这个问题,可以考虑以下三种方法:

  • 设置 binlog_group_commit_sync_delaybinlog_group_commit_sync_no_delay_count参数,减少binlog的写盘次数。这个方法是基于“额外的故意等待”来实现的,因此可能会增加语句的响应时间,但没有丢失数据的风险。
  • sync_binlog 设置为大于1的值(比较常见是100~1000)。这样做的风险是,主机掉电时会丢binlog日志。
  • innodb_flush_log_at_trx_commit设置为2。这样做的风险是,主机掉电的时候会丢数据。

我不建议你把innodb_flush_log_at_trx_commit 设置成0。因为把这个参数设置成0,表示redo log只保存在内存中,这样的话MySQL本身异常重启也会丢数据,风险太大。而redo log写到文件系统的page cache的速度也是很快的,所以将这个参数设置成2跟设置成0其实性能差不多,但这样做MySQL异常重启时就不会丢数据了,相比之下风险会更小。

到此这篇关于Mysql redo log 写入策略和binlog 写入策略的文章就介绍到这了!


Tags in this post...

MySQL 相关文章推荐
Idea连接MySQL数据库出现中文乱码的问题
Apr 14 MySQL
MySQL 数据类型选择原则
May 27 MySQL
新手入门Mysql--sql执行过程
Jun 20 MySQL
MySQL系列之六 用户与授权
Jul 02 MySQL
为什么MySQL选择Repeatable Read作为默认隔离级别
Jul 26 MySQL
MySQL的全局锁和表级锁的具体使用
Aug 23 MySQL
教你使用VS Code的MySQL扩展管理数据库的方法
Jan 22 MySQL
一次SQL如何查重及去重的实战记录
Mar 13 MySQL
MySQL高级进阶sql语句总结大全
Mar 16 MySQL
实战 快速定位MySQL的慢SQL
Mar 22 MySQL
MySQ InnoDB和MyISAM存储引擎介绍
Apr 26 MySQL
MySQL详解进行JDBC编程与增删改查方法
Jun 16 MySQL
优化Mysql查询的示例
Apr 26 #MySQL
MySQL的存储过程和相关函数
Apr 26 #MySQL
mysql 索引的数据结构为什么要采用B+树
MySQ InnoDB和MyISAM存储引擎介绍
pt-archiver 主键自增
Apr 26 #MySQL
提高系统的吞吐量解决数据库重复写入问题
Apr 23 #MySQL
MySQL 数据库范式化设计理论
Apr 22 #MySQL
You might like
jQuery+php实现ajax文件即时上传的详解
2013/06/17 PHP
PHP 返回数组后处理方法(开户成功后弹窗提示)
2017/07/03 PHP
Laravel Eloquent ORM 实现查询表中指定的字段
2019/10/17 PHP
Laravel框架实现定时Task Scheduling例子
2019/10/22 PHP
封装的原生javascript弹出层代码
2010/09/24 Javascript
js 第二代身份证号码的验证机制代码
2011/05/12 Javascript
关于js获取radio和select的属性并控制的代码
2011/05/12 Javascript
js的表单操作 简单计算器
2011/12/29 Javascript
jQuery+css3实现Ajax点击后动态删除功能的方法
2015/08/10 Javascript
过期软件破解办法实例详解
2017/01/04 Javascript
Vue如何从1.0迁移到2.0
2017/10/19 Javascript
vue2.0 elementUI制作面包屑导航栏
2018/02/22 Javascript
vue.js中npm安装教程图解
2018/04/10 Javascript
浅谈vue中关于checkbox数据绑定v-model指令的个人理解
2018/11/14 Javascript
vue双向绑定及观察者模式详解
2019/03/19 Javascript
Vue项目中ESlint规范示例代码
2019/07/04 Javascript
在vue中高德地图引入和轨迹的绘制的实现
2019/10/11 Javascript
vue与django集成打包的实现方法
2019/11/11 Javascript
vuejs中父子组件之间通信方法实例详解
2020/01/17 Javascript
[00:48]食人魔魔法师至宝“金鹏之幸”全新模型和自定义特效展示
2019/12/19 DOTA
Python使用正则表达式过滤或替换HTML标签的方法详解
2017/09/25 Python
python实现用户管理系统
2018/01/10 Python
Python读取excel中的图片完美解决方法
2018/07/27 Python
Python中的Numpy矩阵操作
2018/08/12 Python
python/Matplotlib绘制复变函数图像教程
2019/11/21 Python
执行Python程序时模块报错问题
2020/03/26 Python
通过python 执行 nohup 不生效的解决
2020/04/16 Python
用 Python 制作地球仪的方法
2020/04/24 Python
Python collections.deque双边队列原理详解
2020/10/05 Python
印尼在线购买隐形眼镜网站:Lensza.co.id
2019/04/27 全球购物
EJB的角色和三个对象
2015/12/31 面试题
幼儿教师考核制度
2014/01/25 职场文书
财务人员求职自荐书范文
2014/02/10 职场文书
护理专科毕业自荐信范文
2014/04/21 职场文书
学校领导班子对照检查材料
2014/08/28 职场文书
小学英语教学反思范文
2016/02/15 职场文书