发现线上又很多简单的update语句出现300多ms的慢sql.

慢sql排查,查看执行计划是走索引的,于是联系dba.

dba更改了刷盘策略。

innodb_flush_log_at_trx_commit  和 sync_binlog

mysql的"双1验证"指的是innodb_flush_log_at_trx_commitsync_binlog两个参数设置,这两个是是控制MySQL 磁盘写入策略以及数据安全性的关键参数。下面从参数含义,性能,安全角度阐述两个参数为不同的值时对db 性能,数据的影响。

一、参数意义

innodb_flush_log_at_trx_commit
如果innodb_flush_log_at_trx_commit设置为0:log buffer将每秒一次地写入log file中,flush(刷到磁盘)操作同时进行.该模式下,在事务提交的时候,不会主动触发写入磁盘的操作;
如果innodb_flush_log_at_trx_commit设置为1:每次事务提交时MySQL都会把log buffer的数据写入log file,并且flush(刷到磁盘)中去;
如果innodb_flush_log_at_trx_commit设置为2:每次事务提交时MySQL都会把log buffer的数据写入os cache,但是flush(刷到磁盘)操作并不会同时进行。该模式下,MySQL会每秒执行一次 flush(刷到磁盘)操作。

注意:由于进程调度策略问题,这个"每秒执行一次 flush(刷到磁盘)操作"并不是保证100%的"每秒"。

sync_binlog
sync_binlog 的默认值是0,像操作系统刷其他文件的机制一样,MySQL不会同步到磁盘中去而是依赖操作系统来刷新binary log。
当sync_binlog =N (N>0) ,MySQL 在每写 N次 二进制日志binary log时,会使用fdatasync()函数将它的写二进制日志binary log同步到磁盘中去。

注意:如果启用了autocommit,那么每一个语句statement就会有一次写操作;否则每个事务对应一个写操作。

二、性能

两个参数在不同值时对db的纯写入的影响表现如下:
测试场景1
innodb_flush_log_at_trx_commit=2
sync_binlog=1000

测试场景2
innodb_flush_log_at_trx_commit=1
sync_binlog=1000

测试场景3
innodb_flush_log_at_trx_commit=1
sync_binlog=1

测试场景4
innodb_flush_log_at_trx_commit=1
sync_binlog=1000

测试场景5
innodb_flush_log_at_trx_commit=2
sync_binlog=1000

在以上5个场景下的TPS分别为:
场景1            41000
场景2           33000
场景3           26000
场景4           33000

由此可见,当两个参数设置为双1的时候,写入性能最差,sync_binlog=N (N>1 ) innodb_flush_log_at_trx_commit=2 时,(在当前模式下)MySQL的写操作才能达到最高性能。

三、安全

当innodb_flush_log_at_trx_commit和sync_binlog 都为 1 时是最安全的,在mysqld 服务崩溃或者服务器主机crash的情况下,binary log 只有可能丢失最多一个语句或者一个事务(因为在写),但是鱼与熊掌不可兼得,双11 会导致频繁的io操作,因此该模式也是最慢的一种方式。
innodb_flush_log_at_trx_commit设置为0,mysqld进程的崩溃会导致上一秒钟所有事务数据的丢失。
innodb_flush_log_at_trx_commit设置为2,只有在操作系统崩溃或者系统掉电的情况下,上一秒钟所有事务数据才可能丢失。

"双1设置"适合数据安全性要求非常高,而且磁盘IO写能力足够支持业务,比如订单,交易,充值,支付消费系统。双1模式下,当磁盘IO无法满足业务需求时 比如11.11 活动的压力。推荐的做法是 innodb_flush_log_at_trx_commit=2 ,sync_binlog=N (N为500 或1000) 且使用带蓄电池后备电源的缓存cache,防止系统断电异常。

InnoDB存储引擎日志就只有两种,Redo Log和Undo Log,

  • Redo Log 重做日志,用于记录事务操作的变化,且记录的是修改之后的值。不管事务是否提交都会记录下来。例如在更新数据时,会先将更新的记录写到Redo Log中,再更新缓存中页中的数据。然后按照设置的更新策略,将内存中的数据刷回磁盘。

  • Undo Log 记录的是记录的事务开始之前的一个版本,可用于事务失败之后发生的回滚

mysql server层面的日志。

二进制文件 它有另外一个名字你应该熟悉,叫Binlog,其记录了对数据库所有的更改。

二阶段提交

Prepare阶段,将Redo Log写入文件,并刷入磁盘,记录上内部XA事务的ID,同时将Redo Log状态设置为Prepare。Redo Log写入成功后,再将Binlog同样刷入磁盘,记录XA事务ID。

Commit阶段,向磁盘中的Redo Log写入Commit标识,表示事务提交。然后执行器调用存储引擎的接口提交事务。这就是整个过程。

Prepare阶段,将Redo Log写入文件,并刷入磁盘,记录上内部XA事务的ID,同时将Redo Log状态设置为Prepare。Redo Log写入成功后,再将Binlog同样刷入磁盘,记录XA事务ID。

Commit阶段,向磁盘中的Redo Log写入Commit标识,表示事务提交。然后执行器调用存储引擎的接口提交事务。这就是整个过程。

基于Redo Log和Undo Log的MySQL崩溃恢复流程 - 掘金

mysql 的刷盘策略相关推荐

  1. mysql部署策略_MySQL延迟问题和数据刷盘策略流程分析

    一.MySQL复制流程 官方文档流程如下: MySQL延迟问题和数据刷盘策略 1.绝对的延时,相对的同步 2.纯写操作,线上标准配置下,从库压力大于主库,最起码从库有relaylog的写入. 二.My ...

  2. MySQL基于冷热数据分离优化的LRU刷盘策略

    MySQL基于冷热数据分离优化的LRU刷盘策略 前言 对于计算机刷盘这个概念相信大家都非常熟悉了,刷盘策略,其实在操作系统层面来说的话就是页面置换算法. 不知道各位朋友们还记得页面置换算法有哪些吗? ...

  3. mysql数据刷盘过程详解_MySQL延迟问题和数据刷盘策略流程分析

    一.MySQL复制流程 官方文档流程如下: MySQL延迟问题和数据刷盘策略 1.绝对的延时,相对的同步 2.纯写操作,线上标准配置下,从库压力大于主库,最起码从库有relaylog的写入. 二.My ...

  4. mysql数据刷盘_MySQL延迟问题和数据刷盘策略

    一. MySQL 复制流程 官方文档流程图如下: 1.绝对的延时,相对的同步 2.纯写操作,线上标准配置下,从库压力大于主库,最起码从库有relaylog的写入. 二.MySQL延迟问题分析 1.主库 ...

  5. redo日志的刷盘策略

    转载自:儒猿技术窝的从零开始带你成为MySQL实战优化高手专栏 我们想要提交一个事务了,此时就会根据一定的策略把redo日志从redo log buffer里刷入到磁盘文件里去. 此时这个策略是通过 ...

  6. 针对 MySQL/InnoDB 刷盘调优

    原文 https://www.percona.com/blog/2020/05/14/tuning-mysql-innodb-flushing-for-a-write-intensive-worklo ...

  7. java什么是消息刷盘_RocketMQ刷盘策略

    我们都知道RocketMQ的消息是持久化到文件的,具体的消息的刷盘策略是什么,是发送一条消息就直接持久化到文件中吗?作为一款高性能的消息中间件这样做肯定不行,至少性能上不允许这样操作,那么具体策略是啥 ...

  8. [MySQL] 日志刷盘机制

    概念 MySQL的InnoDB日志管理机制中,有一个概念叫MTR(mini-transaction). MySQL中把对底层页面的一次原子访问的过程称之为一个Mini-Transaction,这里的原 ...

  9. mysql数据刷盘_MySQL InnoDB 日志管理机制中的MTR和日志刷盘

    1.MTR(mini-transaction) 在MySQL的 InnoDB日志管理机制中,有一个很重要的概念就是MTR.MTR是InnoDB存储擎中一个很重要的用来保证物理写的完整性和持久性的机制. ...

最新文章

  1. CentOS源码安装GitLab汉化版第3版
  2. 电信应在短时间内放弃CDMA网络
  3. Visual Studio 快捷键 转载
  4. 指针在函数传参的使用
  5. MMDetection-配置文件
  6. Linux运行jnetpcap程序(含配置步骤)
  7. 【Spring】Spring 解决循环依赖的 3 种方式
  8. opencvpython图像代码_PythonOpenCV各种图像库的图像读写 增强 方式的简单介绍(附代码)...
  9. E72上安装fring使用skypeout拨打电话
  10. 容器技术Docker K8s 11 容器服务Kubernetes版ACK详解-集群查看及管理
  11. Mac: Failed to connect to raw.githubusercontent.com port 443: Connection refused error:
  12. 万圣节html代码大全,《方舟 生存进化》万圣节代码大全一览
  13. 思杰 Citrix ADC产品介绍
  14. 2020个人年度总结
  15. Spring Boot 动态设置数据库密码,密码加密,密码单独处理
  16. 3年开发了5个私人项目:自动化办公、网站、机器人、小程序...免费开源,拿走不谢~
  17. OpenCV开发笔记(六十四):红胖子8分钟带你深入了解SURF特征点(图文并茂+浅显易懂+程序源码)
  18. 【CVPR2020视频超分辨率】Zooming Slow-Mo: Fast and Accurate One-Stage Space-Time Video Super-Resolution 阅读笔记
  19. 【C语言每日一练——第1练:字母大小写转换】
  20. 2022-07 Pandas进阶复盘汇总

热门文章

  1. 设计模式 适配器模式 以手机充电器为例
  2. 计算机关机慢怎么解决方法,电脑关机慢怎么办?加快电脑关机速度方法汇总
  3. ubuntu16.04安装sougou输入法
  4. java mp3文件压缩_java实现文件压缩
  5. 开源分布式图数据库的思考和实践
  6. Javascript--offsetParent属性
  7. 图神经网络应用——基于深度学习的图相似度计算(以SIMGNN为例的保姆级讲解)
  8. https://developer.apple.com/programs/ios/
  9. 2021海南高考成绩电话查询,2021年海南省高考成绩查询时间高招录取名单结果查询网址页面及电话.docx...
  10. 2022年,我们为什么要学习C++?(文末附完整C++后端学习路线)