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 相关文章推荐
如何用Navicat操作MySQL
May 12 MySQL
MySQL查看表和清空表的常用命令总结
May 26 MySQL
MYSQL数据库使用UTF-8中文编码乱码的解决办法
May 26 MySQL
MySQL注入基础练习
May 30 MySQL
MySQL 外键约束和表关系相关总结
Jun 20 MySQL
MySQL里面的子查询的基本使用
Aug 02 MySQL
关于MySQL临时表为什么可以重名的问题
Mar 22 MySQL
mysql数据插入覆盖和时间戳的问题及解决
Mar 25 MySQL
单机多实例部署 MySQL8.0.20
May 15 MySQL
MySql数据库触发器使用教程
Jun 01 MySQL
MySQL如何修改字段类型和字段长度
Jun 10 MySQL
mysql sock文件存储了什么信息
Jul 15 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实现压缩多个CSS与JS文件的方法
2014/11/11 PHP
android上传图片到PHP的过程详解
2015/08/03 PHP
Zend Framework动作助手Url用法详解
2016/03/05 PHP
IE事件对象(The Internet Explorer Event Object)
2012/06/27 Javascript
jquery ajax 局部无刷新更新数据的实现案例
2014/02/08 Javascript
JS应用正则表达式转换大小写示例
2014/09/18 Javascript
javascript与css3动画结合使用小结
2015/03/11 Javascript
使用JavaScript 实现的人脸检测
2015/03/24 Javascript
JS中的Replace方法使用经验分享
2015/05/20 Javascript
jQuery插件imgPreviewQs实现上传图片预览
2016/01/15 Javascript
函数四种调用模式以及其中的this指向
2017/01/16 Javascript
详解用场景去理解函数柯里化(入门篇)
2019/04/11 Javascript
Vue-input框checkbox强制刷新问题
2019/04/18 Javascript
JS实现求字符串中出现最多次数的字符和次数示例
2019/07/05 Javascript
Vue中keep-alive组件作用详解
2020/02/04 Javascript
JavaScript编写开发动态时钟
2020/07/29 Javascript
浅谈Vue使用Elementui修改默认的最快方法
2020/12/05 Vue.js
Webpack3+React16代码分割的实现
2021/03/03 Javascript
[25:59]Newbee vs TNC 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
python开发的小球完全弹性碰撞游戏代码
2013/10/15 Python
python网络爬虫采集联想词示例
2014/02/11 Python
基于Python闭包及其作用域详解
2017/08/28 Python
tensorflow 用矩阵运算替换for循环 用tf.tile而不写for的方法
2018/07/27 Python
Django 创建新App及其常用命令的实现方法
2019/08/04 Python
Python检查 云备份进程是否正常运行代码实例
2019/08/22 Python
scrapy redis配置文件setting参数详解
2020/11/18 Python
时尚设计师手表:The Watch Cabin
2018/10/06 全球购物
const和static readonly区别
2013/05/20 面试题
请说出这段代码执行后a和b的值分别是多少
2015/03/28 面试题
会计师事务所审计实习自我鉴定
2013/09/20 职场文书
财务部出纳岗位职责
2013/12/22 职场文书
大学校庆邀请函
2014/01/11 职场文书
论文答谢词
2015/01/20 职场文书
无婚姻登记记录证明
2015/06/18 职场文书
PO模式在selenium自动化测试框架的优势
2022/03/20 Python
Flutter集成高德地图并添加自定义Maker的实践
2022/04/07 Java/Android