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 29 MySQL
MySQL 可扩展设计的基本原则
May 14 MySQL
mysql优化之query_cache_limit参数说明
Jul 01 MySQL
MySQL系列之一 MariaDB-server安装
Jul 02 MySQL
sql注入教程之类型以及提交注入
Aug 02 MySQL
MySQL中order by的使用详情
Nov 17 MySQL
浅谈MySQL中的六种日志
Mar 23 MySQL
MySQL的存储函数与存储过程的区别解析
Apr 08 MySQL
解决MySQL报“too many connections“错误
Apr 19 MySQL
MySQL数据库简介与基本操作
May 30 MySQL
mysql数据库实现设置字段长度
Jun 10 MySQL
mysql幻读详解实例以及解决办法
Jun 16 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生成zip文件类实例
2015/04/07 PHP
php遍历树的常用方法汇总
2015/06/18 PHP
PHP数组函数array_multisort()用法实例分析
2016/04/02 PHP
老生常谈php中传统验证与thinkphp框架(必看篇)
2017/06/10 PHP
PHP PDOStatement::bindParam讲解
2019/01/30 PHP
JS应用之禁止抓屏、复制、打印
2008/02/21 Javascript
javascript 模拟JQuery的Ready方法实现并出现的问题
2009/12/06 Javascript
jquery easyui的tabs使用时的问题
2010/03/23 Javascript
javascript实现文本域写入字符时限定字数
2014/02/12 Javascript
Js表格万条数据瞬间加载实现代码
2014/02/20 Javascript
JavaScript获取鼠标移动时的坐标(兼容IE8、chome谷歌、Firefox)
2014/09/13 Javascript
JS获取子窗口中返回的数据实现方法
2016/05/28 Javascript
js/jq仿window文件夹框选操作插件
2017/03/08 Javascript
Javarscript中模块(module)、加载(load)与捆绑(bundle)详解
2017/05/28 Javascript
React操作真实DOM实现动态吸底部的示例
2017/10/23 Javascript
微信小程序class封装http代码实例
2019/08/24 Javascript
[03:02]2014DOTA2西雅图邀请赛 让队员自己告诉你DK NAVI备战情况
2014/07/08 DOTA
Python中fnmatch模块的使用详情
2018/11/30 Python
Python操作SQLite数据库过程解析
2019/09/02 Python
Python实现线性判别分析(LDA)的MATLAB方式
2019/12/09 Python
django列表筛选功能的实现代码
2020/03/27 Python
Canvas系列之滤镜效果
2019/02/12 HTML / CSS
英国袜子店:Sock Shop
2017/01/11 全球购物
香港永安旅游网:Wing On Travel
2017/04/10 全球购物
高校生生产实习自我鉴定
2013/09/21 职场文书
会计工作决心书
2014/03/11 职场文书
生产助理岗位职责
2014/06/18 职场文书
市委召开党的群众路线教育实践活动总结大会报告
2014/10/21 职场文书
入党积极分子群众意见
2015/06/01 职场文书
贷款工资证明范本
2015/06/12 职场文书
初中生活随笔
2015/08/15 职场文书
五年级作文之学校的四季
2019/12/05 职场文书
python 如何在 Matplotlib 中绘制垂直线
2021/04/02 Python
css3 利用transform-origin 实现圆点分布在大圆上布局及旋转特效
2021/04/29 HTML / CSS
浅谈Python 中的复数问题
2021/05/19 Python
Win11怎么添加用户?Win11添加用户账户的方法
2022/07/15 数码科技