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 07 MySQL
详解MySQL 用户权限管理
Apr 20 MySQL
MySQL的join buffer原理
Apr 29 MySQL
MySQL 覆盖索引的优点
May 19 MySQL
浅谈MySQL之浅入深出页原理
Jun 23 MySQL
SQL基础的查询语句
Nov 11 MySQL
Mysql数据库表中为什么有索引却没有提高查询速度
Feb 24 MySQL
MySQL分区表管理命令汇总
Mar 21 MySQL
MySQL创建管理LIST分区
Apr 13 MySQL
MySQL如何使备份得数据保持一致
May 02 MySQL
MySQL示例讲解数据库约束以及表的设计
Jun 16 MySQL
MySQL事务的ACID特性以及并发问题方案
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 获取MSN好友列表的代码(2009-05-14测试通过)
2009/09/09 PHP
php 不同编码下的字符串长度区分
2009/09/26 PHP
php数组函数序列之array_pop() - 删除数组中的最后一个元素
2011/11/07 PHP
PHP以指定字段为索引返回数据库所取的数据数组
2013/06/30 PHP
PHP正则验证Email的方法
2015/06/15 PHP
Smarty分页实现方法完整实例
2016/05/11 PHP
PHP两个n位的二进制整数相加问题的解决
2018/08/26 PHP
php使用mysqli和pdo扩展,测试对比mysql数据库的执行效率完整示例
2019/05/09 PHP
Laravel框架Auth用户认证操作实例分析
2019/09/29 PHP
JavaScript实现的简单幂函数实例
2015/04/17 Javascript
jQuery实现checkbox全选的方法
2015/06/10 Javascript
js获取所有checkbox的值的简单实例
2016/05/30 Javascript
原生js代码实现图片放大境效果
2016/10/30 Javascript
Vue.js第二天学习笔记(vue-router)
2016/12/01 Javascript
JS实现两周内自动登录功能
2017/03/23 Javascript
详解ng-alain动态表单SF表单项设置必填和正则校验
2019/06/11 Javascript
学习LayUI时自研的表单参数校验框架案例分析
2019/07/29 Javascript
Python二叉搜索树与双向链表转换实现方法
2016/04/29 Python
Python中将变量按行写入txt文本中的方法
2018/04/03 Python
解决tensorflow模型参数保存和加载的问题
2018/07/26 Python
解决python写入带有中文的字符到文件错误的问题
2019/01/31 Python
Python基本数据结构与用法详解【列表、元组、集合、字典】
2019/03/23 Python
调用HTML5的Canvas API绘制图形的快速入门指南
2016/06/17 HTML / CSS
iostream与iostream.h的区别
2015/01/16 面试题
怎样在 Applet 中建立自己的菜单(MenuBar/Menu)?
2012/06/20 面试题
幼儿园毕业典礼主持词
2014/03/21 职场文书
高一课前三分钟演讲稿
2014/09/13 职场文书
基层党员对照检查材料
2014/09/24 职场文书
总经理助理岗位职责范本
2015/03/31 职场文书
2015小学语文教师个人工作总结
2015/05/20 职场文书
百年孤独读书笔记
2015/06/29 职场文书
关于国庆节的广播稿
2015/08/19 职场文书
2015年社区反邪教工作总结
2015/10/14 职场文书
使用SQL实现车流量的计算的示例代码
2022/02/28 SQL Server
python使用BeautifulSoup 解析HTML
2022/04/24 Python
MySQL count(*)统计总数问题汇总
2022/09/23 MySQL