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 相关文章推荐
left join、inner join、right join的区别
Apr 05 MySQL
MySQL表的增删改查基础教程
Apr 07 MySQL
MySQL 8.0 之不可见列的基本操作
May 20 MySQL
MySQL 使用事件(Events)完成计划任务
May 24 MySQL
详解MySQL多版本并发控制机制(MVCC)源码
Jun 23 MySQL
mysql脏页是什么
Jul 26 MySQL
MySQL中连接查询和子查询的问题
Sep 04 MySQL
Mysql案例刨析事务隔离级别
Sep 25 MySQL
记一次Mysql不走日期字段索引的原因小结
Oct 24 MySQL
mysql中数据库覆盖导入的几种方式总结
Mar 25 MySQL
MySQL视图概念以及相关应用
Apr 19 MySQL
MySQL约束(创建表时的各种条件说明)
Jun 21 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 Memcache 中实现消息队列
2009/11/24 PHP
php之XML转数组函数的详解
2013/06/07 PHP
php 检查电子邮件函数(自写)
2014/01/16 PHP
CI框架AR操作(数组形式)实现插入多条sql数据的方法
2016/05/18 PHP
JS画5角星方法介绍
2013/09/17 Javascript
jQuery中next()方法用法实例
2015/01/07 Javascript
jQuery ajax方法传递中文时出现中文乱码的解决方法
2016/07/25 Javascript
Angular中$cacheFactory的作用和用法实例详解
2016/08/19 Javascript
详解vue的数据binding绑定原理
2017/04/12 Javascript
vue将时间戳转换成自定义时间格式的方法
2018/03/02 Javascript
JavaScript创建、读取和删除cookie
2019/09/03 Javascript
jQuery实现简单聊天室
2020/02/08 jQuery
python实现JAVA源代码从ANSI到UTF-8的批量转换方法
2015/08/10 Python
python爬虫系列Selenium定向爬取虎扑篮球图片详解
2017/11/15 Python
python爬虫爬取网页表格数据
2018/03/07 Python
python list元素为tuple时的排序方法
2018/04/18 Python
Python 利用scrapy爬虫通过短短50行代码下载整站短视频
2018/10/29 Python
python用plt画图时,cmp设置方法
2018/12/13 Python
python实现对列表中的元素进行倒序打印
2019/11/23 Python
Python原始套接字编程实例解析
2020/01/29 Python
详解有关PyCharm安装库失败的问题的解决方法
2020/02/02 Python
7款设计巧妙的css3飘带状3D立体效果的导航菜单和表单窗口
2013/02/04 HTML / CSS
使用CSS3制作一个简单的Chrome模拟器
2015/07/15 HTML / CSS
MANGO官方网站:西班牙芒果服装品牌
2017/01/15 全球购物
佳能德国网上商店:Canon德国
2017/03/18 全球购物
UGG英国官方网站:UGG UK
2018/02/08 全球购物
澳大利亚巧克力花束和礼品网站:Tastebuds
2019/03/15 全球购物
this关键字的含义
2015/04/08 面试题
汽车专业毕业生自荐信
2013/11/03 职场文书
协商一致解除劳动合同协议书
2014/09/14 职场文书
2014年统计工作总结
2014/11/21 职场文书
工作时间调整通知
2015/04/24 职场文书
2015年度女工工作总结
2015/10/22 职场文书
2019数学教师下学期工作总结
2019/06/27 职场文书
解决MySQL添加新用户-ERROR 1045 (28000)的问题
2022/03/03 MySQL
关于vue-router-link选择样式设置
2022/04/30 Vue.js