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 相关文章推荐
多属性、多分类MySQL模式设计
Apr 05 MySQL
详解MySQL事务的隔离级别与MVCC
Apr 22 MySQL
MySQL kill不掉线程的原因
May 07 MySQL
如何用Navicat操作MySQL
May 12 MySQL
MySQL注入基础练习
May 30 MySQL
Mysql数据库按时间点恢复实战记录
Jun 30 MySQL
MySQL库表太大怎么办? 数据库分库分表项目实践
Apr 11 MySQL
mysql 索引的数据结构为什么要采用B+树
Apr 26 MySQL
MySQL查询日期时间
May 15 MySQL
MySQL数据库表约束讲解
Jun 21 MySQL
MySQL提升大量数据查询效率的优化神器
Jul 07 MySQL
MySql统计函数COUNT的具体使用详解
Aug 14 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
解析WordPress中函数钩子hook的作用及基本用法
2015/12/22 PHP
PHP文件上传处理案例分析
2016/10/15 PHP
PHP实现限制IP访问的方法
2017/04/20 PHP
js表数据排序 sort table data
2009/02/18 Javascript
小议javascript 设计模式 推荐
2009/10/28 Javascript
一些mootools的学习资源
2010/02/07 Javascript
jQuery 类twitter的文本字数限制带提示效果插件
2010/04/16 Javascript
javascript中的变量是传值还是传址的?
2010/04/19 Javascript
网页上的Javascript编辑器和代码格式化
2010/04/25 Javascript
Javascript 垃圾收集机制介绍理解
2013/05/14 Javascript
js实现简洁大方的二级下拉菜单效果代码
2015/09/01 Javascript
动态的9*9乘法表效果的实现代码
2016/05/16 Javascript
Angular学习笔记之angular的$filter服务浅析
2016/11/12 Javascript
jQuery实现页面滚动时智能浮动定位
2017/01/08 Javascript
基于javascript实现最简单选项卡切换
2017/02/01 Javascript
详解使用angularjs的ng-options时如何设置默认值(初始值)
2017/07/18 Javascript
jQuery 实时保存页面动态添加的数据的示例
2017/08/14 jQuery
写一个移动端惯性滑动&回弹Vue导航栏组件 ly-tab
2018/03/06 Javascript
Vue+ElementUI项目使用webpack输出MPA的方法
2019/08/27 Javascript
vuex 实现getter值赋值给vue组件里的data示例
2019/11/05 Javascript
5个你不知道的JavaScript字符串处理库(小结)
2020/06/01 Javascript
Element Badge标记的使用方法
2020/07/27 Javascript
python实现堆栈与队列的方法
2015/01/15 Python
python实用代码片段收集贴
2015/06/03 Python
深入理解Python分布式爬虫原理
2017/11/23 Python
Python内置函数delattr的具体用法
2017/11/23 Python
python实现dijkstra最短路由算法
2019/01/17 Python
numpy库与pandas库axis=0,axis= 1轴的用法详解
2019/05/27 Python
Python word文本自动化操作实现方法解析
2020/11/05 Python
CSS3制作炫酷的下拉菜单及弹起式选单的实例分享
2016/05/17 HTML / CSS
纯css3实现思维导图样式示例
2018/11/01 HTML / CSS
美国知名生活购物网站:Goop
2017/11/03 全球购物
取保候审保证书
2014/04/30 职场文书
明星员工获奖感言
2014/08/14 职场文书
深入理解redis中multi与pipeline
2021/06/02 Redis
CSS实现九宫格布局(自适应)的示例代码
2022/02/12 HTML / CSS