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锁机制
Apr 05 MySQL
MySQL数字类型自增的坑
May 07 MySQL
正确使用MySQL INSERT INTO语句
May 26 MySQL
如何自己动手写SQL执行引擎
Jun 02 MySQL
Mysql 设置boolean类型的操作
Jun 04 MySQL
mysql优化之query_cache_limit参数说明
Jul 01 MySQL
MySQL into_Mysql中replace与replace into用法案例详解
Sep 14 MySQL
Mysql InnoDB 的内存逻辑架构
May 06 MySQL
Mysql中mvcc各场景理解应用
Aug 05 MySQL
前端传参数进行Mybatis调用mysql存储过程执行返回值详解
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
《DOTA3》开发工作已经开始 《DOTA3》将代替《DOTA2》
2021/03/06 DOTA
php中文字符截取防乱码
2008/03/28 PHP
Smarty Foreach 使用说明
2010/03/23 PHP
php is_file 判断给定文件名是否为一个正常的文件
2010/05/10 PHP
XMLHTTPRequest的属性和方法简介
2010/11/23 Javascript
Js sort排序使用方法
2011/10/17 Javascript
javascript倒计时功能实现代码
2012/06/07 Javascript
捕获键盘事件(且兼容各浏览器)
2013/07/03 Javascript
Jquery实现自定义弹窗示例
2014/03/12 Javascript
jQuery内置的AJAX功能和JSON的使用实例
2014/07/27 Javascript
JavaScript中常见获取元素的方法汇总
2015/03/04 Javascript
javascript数据结构与算法之检索算法
2015/04/04 Javascript
基于jquery实现图片相关操作(重绘、获取尺寸、调整大小、缩放)
2015/12/25 Javascript
js自调用匿名函数的三种写法(推荐)
2016/08/19 Javascript
js中作用域的实例解析
2017/03/16 Javascript
Angular 4依赖注入学习教程之InjectToken的使用(八)
2017/06/04 Javascript
基于 D3.js 绘制动态进度条的实例详解
2018/02/26 Javascript
使用jQuery动态设置单选框的选中效果
2018/12/06 jQuery
Layui数据表格跳转到指定页的实现方法
2019/09/05 Javascript
[00:31]DOTA2上海特级锦标赛 Fnatic战队宣传片
2016/03/04 DOTA
详解Python的Django框架中的模版继承
2015/07/16 Python
Python找出list中最常出现元素的方法
2016/06/14 Python
使用Python写CUDA程序的方法
2017/03/27 Python
3种python调用其他脚本的方法
2020/01/06 Python
Python 整行读取文本方法并去掉readlines换行\n操作
2020/09/03 Python
python实现sm2和sm4国密(国家商用密码)算法的示例
2020/09/26 Python
Python爬取你好李焕英豆瓣短评生成词云的示例代码
2021/02/24 Python
HTML5 实现一个访问本地文件的实例
2012/12/13 HTML / CSS
HTML5超炫酷粒子效果的进度条的实现示例
2019/08/23 HTML / CSS
市场营销管理制度
2014/01/29 职场文书
求职简历的自我评价
2014/01/31 职场文书
委托协议书范本
2014/04/22 职场文书
促销活动总结怎么写
2014/06/25 职场文书
学校食堂食品安全责任书
2014/07/28 职场文书
2016年学校“3.12”植树节活动总结
2016/03/16 职场文书
解决MySQL报“too many connections“错误
2022/04/19 MySQL