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 性能监控及调优
Apr 06 MySQL
Mysql systemctl start mysqld报错的问题解决
Jun 03 MySQL
MySQL子查询中order by不生效问题的解决方法
Aug 02 MySQL
MySQL千万级数据表的优化实战记录
Aug 04 MySQL
一条 SQL 语句执行过程
Mar 17 MySQL
mysql中DCL常用的用户和权限控制
Mar 31 MySQL
CentOS 7安装mysql5.7使用XtraBackUp备份工具命令详解
Apr 12 MySQL
Mysql数据库事务的脏读幻读及不可重复读详解
May 30 MySQL
MySQL数据库之内置函数和自定义函数 function
Jun 16 MySQL
mysqldump进行数据备份详解
Jul 15 MySQL
SQL Server数据库的三种创建方法汇总
May 08 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语法(5)
2006/10/09 PHP
php设计模式 State (状态模式)
2011/06/26 PHP
PHP实现按之字形顺序打印二叉树的方法
2018/01/16 PHP
JavaScript延迟加载
2021/03/09 Javascript
特殊字符、常规符号及其代码对照表
2006/06/26 Javascript
跨浏览器的事件对象介绍
2012/06/27 Javascript
JavaScript编写带旋转+线条干扰的验证码脚本实例
2016/05/30 Javascript
JSON与String互转的实现方法(Javascript)
2016/09/27 Javascript
解决ajax不能访问本地文件问题(利用js跨域原理)
2017/01/24 Javascript
AngularJS使用ocLazyLoad实现js延迟加载
2017/07/05 Javascript
layui实现动态和静态分页
2018/04/28 Javascript
原生js实现form表单序列化的方法
2018/08/02 Javascript
jenkins自动构建发布vue项目的方法步骤
2021/01/04 Vue.js
[01:09:50]VP vs Pain 2018国际邀请赛小组赛BO2 第二场
2018/08/20 DOTA
pycharm 使用心得(六)进行简单的数据库管理
2014/06/06 Python
python开发环境PyScripter中文乱码问题解决方案
2016/09/11 Python
获取Django项目的全部url方法详解
2017/10/26 Python
numpy 计算两个数组重复程度的方法
2018/11/07 Python
pip安装py_zipkin时提示的SSL问题对应
2018/12/29 Python
Django 表单模型选择框如何使用分组
2019/05/16 Python
Django 中自定义 Admin 样式与功能的实现方法
2019/07/04 Python
tensorflow使用range_input_producer多线程读取数据实例
2020/01/20 Python
django 利用Q对象与F对象进行查询的实现
2020/05/15 Python
python代码如何注释
2020/06/01 Python
python中用Scrapy实现定时爬虫的实例讲解
2021/01/18 Python
c++工程师面试问题
2013/08/04 面试题
什么是重载?CTS、CLS和CLR分别做何解释
2012/05/06 面试题
Structs界面控制层技术
2013/10/11 面试题
热能动力工程毕业生自荐信
2013/11/07 职场文书
销售实习自我鉴定
2013/12/07 职场文书
超级搞笑检讨书
2014/01/15 职场文书
小学优秀教育工作者事迹材料
2014/05/09 职场文书
公安交警中队队长个人对照检查材料思想汇报
2014/10/05 职场文书
拯救大兵瑞恩观后感
2015/06/09 职场文书
vite+vue3.0+ts+element-plus快速搭建项目的实现
2021/06/24 Vue.js
基于MySql验证的vsftpd虚拟用户
2021/11/07 MySQL