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性能压力基准测试工具sysbench的使用简介
Apr 21 MySQL
MySQL主从搭建(多主一从)的实现思路与步骤
May 13 MySQL
浅谈MySQL next-key lock 加锁范围
Jun 07 MySQL
MySQL中存储时间的最佳实践指南
Jul 01 MySQL
mysql定时自动备份数据库的方法步骤
Jul 07 MySQL
Mysql中where与on的区别及何时使用详析
Aug 04 MySQL
MySQL定时备份数据库(全库备份)的实现
Sep 25 MySQL
面试被问select......for update会锁表还是锁行
Nov 11 MySQL
MySQL 数据类型详情
Nov 11 MySQL
MySQL分区表管理命令汇总
Mar 21 MySQL
一文了解MYSQL三大范式和表约束
Apr 03 MySQL
mysql全面解析json/数组
Jul 07 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
全国FM电台频率大全 - 4 山西省
2020/03/11 无线电
PHP程序员面试 切忌急功近利(更需要注重以后的发展)
2010/09/01 PHP
PHP flock 文件锁详细介绍
2012/12/29 PHP
PHP实现的多彩标签效果代码分享
2014/08/21 PHP
php简单实现快速排序的方法
2015/04/04 PHP
php简单解析mysqli查询结果的方法(2种方法)
2016/06/29 PHP
PHP基于curl后台远程登录正方教务系统的方法
2016/10/14 PHP
浅谈htmlentities 、htmlspecialchars、addslashes的使用方法
2016/12/09 PHP
Laravel中七个非常有用但很少人知道的Carbon方法
2017/09/21 PHP
PHP的PDO预处理语句与存储过程
2019/01/27 PHP
PHP filesize函数用法浅析
2019/02/15 PHP
PHP自动载入类文件函数__autoload的使用方法
2019/03/25 PHP
Chrome Form多次提交表单问题的解决方法
2011/05/09 Javascript
JavaScript实现梯形乘法表的方法
2015/04/25 Javascript
多个js毫秒倒计时同时进行效果
2016/01/05 Javascript
mui上拉加载功能实例详解
2017/04/13 Javascript
基于nodejs+express4.X实现文件下载的实例代码
2017/07/13 NodeJs
浅谈JavaScript中的属性:如何遍历属性
2017/09/14 Javascript
vue基于Element构建自定义树的示例代码
2017/09/19 Javascript
[51:43]OG vs LGD 2018国际邀请赛淘汰赛BO3 第五场 8.26
2018/08/30 DOTA
Python下singleton模式的实现方法
2014/07/16 Python
用Python解决计数原理问题的方法
2016/08/04 Python
python实现数据图表
2017/07/29 Python
Python模拟简单电梯调度算法示例
2018/08/20 Python
python matplotlib实现双Y轴的实例
2019/02/12 Python
python tornado修改log输出方式
2019/11/18 Python
python 服务器运行代码报错ModuleNotFoundError的解决办法
2020/09/16 Python
python3爬虫中引用Queue的实例讲解
2020/11/24 Python
巴西Mr. Cat在线商店:购买包包和鞋子
2019/09/08 全球购物
澳大利亚领先的男装零售连锁店:Lowes
2020/08/07 全球购物
数组越界问题
2015/10/21 面试题
三年级班级文化建设方案
2014/05/04 职场文书
情况说明书格式范文
2014/05/06 职场文书
节约用水演讲稿
2014/05/21 职场文书
教师师德师风自我剖析材料
2014/09/29 职场文书
优秀班主任主要事迹材料
2014/12/16 职场文书