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 Show Profile
Apr 05 MySQL
MySQL 使用SQL语句修改表名的实现
Apr 07 MySQL
将图片保存到mysql数据库并展示在前端页面的实现代码
May 02 MySQL
MySQL注入基础练习
May 30 MySQL
MySQL连表查询分组去重的实现示例
Jul 01 MySQL
mysql配置SSL证书登录的实现
Sep 04 MySQL
面试提问mysql一张表到底能存多少数据
Mar 13 MySQL
MySQL中rank() over、dense_rank() over、row_number() over用法介绍
Mar 23 MySQL
一次Mysql update sql不当引起的生产故障记录
Apr 01 MySQL
MySQL的存储函数与存储过程的区别解析
Apr 08 MySQL
MySQL的prepare使用以及遇到的bug
May 11 MySQL
MYSQL中文乱码问题的解决方案
Jun 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
PHP调用Webservice实例代码
2011/07/29 PHP
php采用curl实现伪造IP来源的方法
2014/11/21 PHP
PHP实现懒加载的方法
2015/03/07 PHP
PHP MPDF中文乱码的解决方式
2015/12/08 PHP
PHP使用Redis替代文件存储Session的方法
2017/02/15 PHP
php+javascript实现的动态显示服务器运行程序进度条功能示例
2017/08/07 PHP
利用Homestead快速运行一个Laravel项目的方法详解
2017/11/14 PHP
PHP实现的62进制转10进制,10进制转62进制函数示例
2019/06/06 PHP
javascript或asp实现的判断身份证号码是否正确两种验证方法
2009/11/26 Javascript
Jquery获取和修改img的src值的方法
2014/02/17 Javascript
jquery插件jSignature实现手动签名
2015/05/04 Javascript
整理Javascript基础语法学习笔记
2015/11/29 Javascript
jQuery实现表格行和列的动态添加与删除方法【测试可用】
2016/08/01 Javascript
AngularJS入门教程之XHR和依赖注入详解
2016/08/18 Javascript
Node.js connect ECONNREFUSED错误解决办法
2016/09/15 Javascript
KnockoutJS 3.X API 第四章之数据控制流if绑定和ifnot绑定
2016/10/10 Javascript
js实现交通灯效果
2017/01/13 Javascript
JS实现简易的图片拖拽排序实例代码
2017/06/09 Javascript
vue将单页面改造成多页面应用的方法
2018/11/25 Javascript
微信小程序页面间传递数组对象方法解析
2019/11/06 Javascript
Vue项目利用axios请求接口下载excel
2020/11/17 Vue.js
[02:28]PWL开团时刻DAY3——Ink Ice与DeMonsTer之间的勾心斗角
2020/11/03 DOTA
探索Python3.4中新引入的asyncio模块
2015/04/08 Python
python递归查询菜单并转换成json实例
2017/03/27 Python
TensorFlow如何实现反向传播
2018/02/06 Python
Python线程池模块ThreadPoolExecutor用法分析
2018/12/28 Python
python tqdm 实现滚动条不上下滚动代码(保持一行内滚动)
2020/02/19 Python
python怎么判断素数
2020/07/01 Python
俄罗斯化妆品和香水网上商店:Iledebeaute
2019/01/03 全球购物
国庆节活动总结
2014/08/26 职场文书
九一八事变演讲稿
2014/09/05 职场文书
商务英语专业大学生职业生涯规划书
2014/09/14 职场文书
上课说话检讨书
2015/01/27 职场文书
委托收款证明
2015/06/23 职场文书
小学体育队列队形教学反思
2016/02/16 职场文书
Python之基础函数案例详解
2021/08/30 Python