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 相关文章推荐
多表查询、事务、DCL
Apr 05 MySQL
详解Mysql和Oracle之间的误区
May 18 MySQL
MySQL 视图(View)原理解析
May 19 MySQL
mysql5.7使用binlog 恢复数据的方法
Jun 03 MySQL
安装配置mysql及Navicat prenium的详细流程
Jun 10 MySQL
MySQL系列之十 MySQL事务隔离实现并发控制
Jul 02 MySQL
MySQL中datetime时间字段的四舍五入操作
Oct 05 MySQL
mysql5.7的安装及Navicate长久免费使用的实现过程
Nov 17 MySQL
MySQL创建定时任务
Jan 22 MySQL
进阶篇之linux环境下安装MySQL数据库
Apr 09 MySQL
深入理解mysql事务隔离级别和存储引擎
Apr 12 MySQL
jdbc中自带MySQL 连接池实践示例
Jul 23 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
怎样辨别一杯好咖啡
2021/03/03 新手入门
PHP 高手之路(一)
2006/10/09 PHP
用PHP的ob_start();控制您的浏览器cache!
2007/02/14 PHP
destoon实现公司新闻详细页添加评论功能的方法
2014/07/15 PHP
php观察者模式应用场景实例详解
2017/02/03 PHP
PHP实现表单提交数据的验证处理功能【防SQL注入和XSS攻击等】
2017/07/21 PHP
分享5个非常有用的Laravel Blade指令
2018/05/30 PHP
Javascript var变量隐式声明方法
2009/10/19 Javascript
正负小数点后两位浮点数实现原理及代码
2013/09/06 Javascript
js setTimeout opener的用法示例详解
2013/10/23 Javascript
JS按字节截取字符长度实例
2013/11/20 Javascript
jQuery遮罩层实现方法实例详解(附遮罩层插件)
2015/12/08 Javascript
不间断循环滚动效果的实例代码(必看篇)
2016/10/08 Javascript
使用jquery给指定的table动态添加一行、删除一行
2016/10/13 Javascript
BootStrap实现鼠标悬停下拉列表功能
2017/02/17 Javascript
详解开发react应用最好用的脚手架 create-react-app
2018/04/24 Javascript
Node.js操作系统OS模块用法分析
2019/01/04 Javascript
微信小程序8种数据通信的方式小结
2020/02/03 Javascript
Vue中使用Echarts仪表盘展示实时数据的实现
2020/11/01 Javascript
js实现类选择器和name属性选择器的示例步骤
2021/02/07 Javascript
[35:34]Liquid vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
python Celery定时任务的示例
2018/03/13 Python
python之pandas用法大全
2018/03/13 Python
python3.X 抓取火车票信息【修正版】
2018/06/19 Python
python 将对象设置为可迭代的两种实现方法
2019/01/21 Python
Python实现使用request模块下载图片demo示例
2019/05/24 Python
python中用logging实现日志滚动和过期日志删除功能
2019/08/20 Python
python中如何实现将数据分成训练集与测试集的方法
2019/09/13 Python
纯css实现照片墙3D效果的示例代码
2017/11/13 HTML / CSS
HTML5的新特性(1)
2016/03/03 HTML / CSS
Melijoe英国官网:法国儿童时尚网站
2016/11/18 全球购物
新学期家长寄语
2014/01/19 职场文书
文明学生事迹材料
2014/01/29 职场文书
冬季安全检查方案
2014/05/23 职场文书
员工年终考核评语
2014/12/31 职场文书
详解如何在Canvas中添加事件的方法
2021/04/17 Javascript