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数据库中存入汉字报错的方法
May 06 MySQL
MySQL获取所有分类的前N条记录
May 07 MySQL
如何用Navicat操作MySQL
May 12 MySQL
MySQL如何构建数据表索引
May 13 MySQL
Mysql 用户权限管理实现
May 25 MySQL
详解MySQL中的pid与socket
Jun 15 MySQL
MySQL日期时间函数知识汇总
Mar 17 MySQL
mysql中DCL常用的用户和权限控制
Mar 31 MySQL
Innodb存储引擎中的后台线程详解
Apr 03 MySQL
以MySQL5.7为例了解一下执行计划
Apr 13 MySQL
解决MySQL报“too many connections“错误
Apr 19 MySQL
解决Mysql中的innoDB幻读问题
Apr 29 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定义数组和使用示例(php数组的定义方法)
2014/03/29 PHP
ThinkPHP CURD方法之data方法详解
2014/06/18 PHP
php连接与操作PostgreSQL数据库的方法
2014/12/25 PHP
PHP使用strstr()函数获取指定字符串后所有字符的方法
2016/01/07 PHP
Laravel搭建后台登录系统步骤详解
2016/07/26 PHP
让iframe自适应高度(支持XHTML,支持FF)
2007/07/24 Javascript
Javascript自定义排序 node运行 实例
2013/06/05 Javascript
更快的异步执行(setTimeout多浏览器)
2014/08/12 Javascript
javascript省市区三级联动下拉框菜单实例演示
2015/11/29 Javascript
jQuery短信验证倒计时功能实现方法详解
2016/05/25 Javascript
分享一个插件实现水珠自动下落效果
2016/06/01 Javascript
JS定时器用法分析【时钟与菜单中的应用】
2016/12/21 Javascript
jQuery使用正则验证15/18身份证的方法示例
2017/04/27 jQuery
Java设计中的Builder模式的介绍
2018/03/22 Javascript
js中对象和面向对象与Json介绍
2019/01/21 Javascript
简单了解vue.js数组的常用操作
2019/06/17 Javascript
JavaScript实现好看的跟随彩色气泡效果
2020/02/06 Javascript
Vue的props父传子的示例代码
2020/05/20 Javascript
跟老齐学Python之大话题小函数(2)
2014/10/10 Python
在Heroku云平台上部署Python的Django框架的教程
2015/04/20 Python
python调用OpenCV实现人脸识别功能
2018/05/25 Python
python kafka 多线程消费者&手动提交实例
2019/12/21 Python
Python编程快速上手——strip()函数的正则表达式实现方法分析
2020/02/29 Python
Keras中的多分类损失函数用法categorical_crossentropy
2020/06/11 Python
人力资源管理专业学生自我评价
2013/11/20 职场文书
土建资料员岗位职责
2014/01/04 职场文书
《我的伯父鲁迅先生》教学反思
2014/02/12 职场文书
企业出纳岗位职责
2014/03/12 职场文书
技术负责人任命书
2014/06/05 职场文书
教师师德表现自我评价
2015/03/05 职场文书
个人年终总结开头
2015/03/06 职场文书
理想国读书笔记
2015/06/25 职场文书
2016年幼儿园教研活动总结
2016/04/05 职场文书
你真的了解redis为什么要提供pipeline功能
2021/06/22 Redis
Python+Appium自动化测试的实战
2021/06/30 Python
MySQL磁盘碎片整理实例演示
2022/04/03 MySQL