Mysql数据库中的redo log 写入策略和binlog 写入策略
作者:男人要霸气 发布时间:2024-01-27 08:21:14
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_binlog
和 innodb_flush_log_at_trx_commit
的配置都是1
,也就是说,一个事务完整提交前,需要等待两次刷盘,一次是redo log
,一次是binlog
。
性能瓶颈
如果你的MySQL现在出现了性能瓶颈,而且瓶颈在IO上,可以通过哪些方法来提升性能呢?
针对这个问题,可以考虑以下三种方法:
设置
binlog_group_commit_sync_delay
和binlog_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异常重启时就不会丢数据了,相比之下风险会更小。
来源:https://blog.csdn.net/weixin_42740530/article/details/124413921
猜你喜欢
- python语言的一大优势:为科学计算提供了大量的支持功能,math模块提供了很多数学计算函数。math模块定义了一些数学模块,这个模块属于
- 版本:python2.7 2.7 2.7!!!症状:比如,我编写了一个字符串number,输出到网页上,变成了u'number
- 本文实例讲述了Python设计模式之命令模式原理与用法。分享给大家供大家参考,具体如下:命令模式(Command Pattern):将请求封
- 问题背景:有一批需要处理的文件,对于每一个文件,都需要调用同一个函数进行处理,相当耗时。有没有加速的办法呢?当然有啦,比如说你将这些文件分成
- 好不容易有些空余时间,便拿来写自己的CSS选择器引擎了,这个CSS选择器引擎的目标只有三个:速度要快代码要精简要支持CSS3的选择器。希望通
- 网上有很多方法能够过去到IP地址归属地的脚本,但是我发现淘宝IP地址库的信息更详细些,所以用shell写个脚本来处理日常工作中一些IP地址分
- 栗子:计算斐波那契数列(任一个数都是前两个数之和的数字序列)Python2.7实现代码如下:<strong><span s
- 由于笔者最近在做一个跨数据库操作的测试,开始做IBatisNet (IBatis.DataMapper.1.6.2/IBatis.DataA
- 在我们的`` current_datetime`` 视图范例中,尽管内容是动态的,但是URL ( /time/ )是静态的。 在 大多数动态
- DataGrip支持几乎所有主流的关系数据库产品,如DB2、Derby、H2、MySQL、Oracle、PostgreSQL、SQL Ser
- 本文实例为大家分享了Django实现分页功能,为了容易区别功能的展现,先创建一个数据库,用数据库中的数据做演示。创建数据库步骤如下:1.创建
- 最近找遍了python的各个函数发现无法直接生成随机的二维数组,其中包括random()相关的各种方法,都没有得到想要的结果。最后在一篇博客
- 这篇文章主要介绍了python连接字符串过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以
- 以下是个人在学习beautifulSoup过程中的一些总结,目前我在使用爬虫数据时使用的方法的是:先用find_all()找出需要内容所在的
- 某人使用如下过滤代码,发现经常被黑:n=request.form("username") p=request.form(
- 为什么要建立索引?当在非常大的表中进行查询,如果数据库进行全表遍历的话那么速度是会非常慢的,而我们的索引则可以建立一个b+树的结构,可以自上
- 爬虫:一段自动抓取互联网信息的程序,从互联网上抓取对于我们有价值的信息,一般来说,Python爬虫程序很多时候都要使用(飞猪IP)代理的IP
- 当我发现要写python的面向对象的时候,我是踌躇满面,坐立不安呀。我一直在想:这个坑应该怎么爬?因为python中关于面向对象的内容很多,
- 本文实例讲述了Python实现针对给定字符串寻找最长非重复子串的方法。分享给大家供大家参考,具体如下:问题:给定一个字符串,寻找其中最长的重
- Python打包分发工具setuptools:曾经 Python 的分发工具是 distutils,但它无法定义包之间的依赖关系。setup