当前位置: 首页 > news >正文

Mysql什么版本支持组提交_MYSQL组提交

组提交(group commit)是MYSQL处理日志的一种优化方式,主要为了解决写日志时频繁刷磁盘的问题。组提交伴随着MYSQL的发展不断优化,从最初只支持redo log 组提交,到目前5.6官方版本同时支持redo log 和binlog组提交。组提交的实现大大提高了mysql的事务处理性能,下文将以innodb 存储引擎为例,详细介绍组提交在各个阶段的实现原理。

redo log的组提交

WAL(Write-Ahead-Logging)是实现事务持久性的一个常用技术,基本原理是在提交事务时,为了避免磁盘页面的随机写,只需要保证事务的redo log写入磁盘即可,这样可以通过redo log的顺序写代替页面的随机写,并且可以保证事务的持久性,提高了数据库系统的性能。虽然WAL使用顺序写替代了随机写,但是,每次事务提交,仍然需要有一次日志刷盘动作,受限于磁盘IO,这个操作仍然是事务并发的瓶颈。

组提交思想是,将多个事务redo log的刷盘动作合并,减少磁盘顺序写。Innodb的日志系统里面,每条redo log都有一个LSN(Log Sequence Number),LSN是单调递增的。每个事务执行更新操作都会包含一条或多条redo log,各个事务将日志拷贝到log_sys_buffer时(log_sys_buffer 通过log_mutex

保护),都会获取当前最大的LSN,因此可以保证不同事务的LSN不会重复。那么假设三个事务Trx1,Trx2和Trx3的日志的最大LSN分别为LSN1,LSN2,LSN3(LSN1

获取 log_mutex

若flushed_to_disk_lsn>=lsn,表示日志已经被刷盘,跳转5

若 current_flush_lsn>=lsn,表示日志正在刷盘中,跳转5后进入等待状态

将小于LSN的日志刷盘(flush and sync)

退出log_mutex

备注:lsn表示事务的lsn,flushed_to_disk_lsn和current_flush_lsn分别表示已刷盘的LSN和正在刷盘的LSN。

两阶段提交

在单机情况下,redo log组提交很好地解决了日志落盘问题,那么开启binlog后,binlog能否和redo log一样也开启组提交?首先开启binlog后,我们要解决的一个问题是,如何保证binlog和redo log的一致性。因为binlog是Master-Slave的桥梁,如果顺序不一致,意味着Master-Slave可能不一致。MYSQL通过两阶段提交很好地解决了这一问题。Prepare阶段,innodb刷redo log,并将回滚段设置为Prepared状态,binlog不作任何操作;commit阶段,innodb释放锁,释放回滚段,设置提交状态,binlog刷binlog日志。出现异常,需要故障恢复时,若发现事务处于Prepare阶段,并且binlog存在则提交,否则回滚。通过两阶段提交,保证了redo log和binlog在任何情况下的一致性。

binlog的组提交

回到上节的问题,开启binlog后,如何在保证redo log-binlog一致的基础上,实现组提交。因为这个问题,5.6以前,mysql在开启binlog的情况下,无法实现组提交,通过一个臭名昭著的prepare_commit_mutex,将redo log和binlog刷盘串行化,串行化的目的也仅仅是为了保证redo log-Binlog一致,但这种实现方式牺牲了性能。这个情况显然是不能容忍的,因此各个mysql分支,mariadb,facebook,perconal等相继出了补丁改进这一问题,mysql官方版本5.6也终于解决了这一问题。由于各个分支版本解决方法类似,我主要通过分析5.6的实现来说明实现方法。

binlog组提交的基本思想是,引入队列机制保证innodb commit顺序与binlog落盘顺序一致,并将事务分组,组内的binlog刷盘动作交给一个事务进行,实现组提交目的。binlog提交将提交分为了3个阶段,FLUSH阶段,SYNC阶段和COMMIT阶段。每个阶段都有一个队列,每个队列有一个mutex保护,约定进入队列第一个线程为leader,其他线程为follower,所有事情交由leader去做,leader做完所有动作后,通知follower刷盘结束。binlog组提交基本流程如下:

FLUSH 阶段

1)      持有Lock_log mutex [leader持有,follower等待]

2)      获取队列中的一组binlog(队列中的所有事务)

3)      将binlog buffer到I/O cache

4)      通知dump线程dump binlog

SYNC阶段

1)      释放Lock_log mutex,持有Lock_sync mutex[leader持有,follower等待]

2)      将一组binlog 落盘(sync动作,最耗时,假设sync_binlog为1)

COMMIT阶段

1)      释放Lock_sync mutex,持有Lock_commit mutex[leader持有,follower等待]

2)      遍历队列中的事务,逐一进行innodb commit

3)      释放Lock_commit mutex

4)      唤醒队列中等待的线程

说明:由于有多个队列,每个队列各自有mutex保护,队列之间是顺序的,约定进入队列的一个线程为leader,因此FLUSH阶段的leader可能是SYNC阶段的follower,但是follower永远是follower。

通过上文分析,我们知道MYSQL目前的组提交方式解决了一致性和性能的问题。通过二阶段提交解决一致性,通过redo log和binlog的组提交解决磁盘IO的性能。下面我整理了Prepare阶段和Commit阶段的框架图供各位参考。

A144839796-141748.png_small.png

A144842015-141748.png_small.png

参考文档

外链网址已屏蔽

外链网址已屏蔽;aid=250169&page=all

外链网址已屏蔽

外链网址已屏蔽

外链网址已屏蔽

相关文章:

  • mysql纵列改成恒列_php-如何将mysql表行显示为列
  • mysql ssl 2026_解决连接到 Amazon RDS for MySQL 或 Aurora 实例时的 ERROR 2026 SSL 连接错误...
  • opensuse rpm安装mysql_rpm安装MySQL
  • 顺序表的基本操作_顺序表基本操作上机实验
  • lede软路由Mysql未运行_Proxmox VE(PVE)安装LEDE/OpenWrt 软路由系统|虚拟机环境
  • mysql的awr生成语句_如何生成指定SQL语句的AWR报表
  • mysql对建表语句长度的限制_MySQL 建表字段长度的限制
  • 编译安装mysql加入services_编译安装MySQL数据库
  • win7下ado连接mysql_提示连接无法用于执行此操作_提示错误“连接无法用于执行此操作。再此上下文中可能已被关闭或者无效”...
  • java sha_原生Java实现SHA256算法
  • java spring 事务控制器_spring之事务总结
  • java adt怎么使用_Java ADT中如何使用ImageView控件
  • java setforeground_java 中的JProgressBar设置前景色foreground无效果
  • python数字加密货币_GitHub - cugbliwei/cryptocurrency: 数字加密货币项目
  • java实现Tomasulo算法_并行计算机组成与设计pdf
  • Android Volley源码解析
  • android 一些 utils
  • angular学习第一篇-----环境搭建
  • CODING 缺陷管理功能正式开始公测
  • docker python 配置
  • Mac转Windows的拯救指南
  • Mysql5.6主从复制
  • PAT A1017 优先队列
  • Python学习之路16-使用API
  • React+TypeScript入门
  • 对象管理器(defineProperty)学习笔记
  • 给自己的博客网站加上酷炫的初音未来音乐游戏?
  • 关于 Linux 进程的 UID、EUID、GID 和 EGID
  • 官方解决所有 npm 全局安装权限问题
  • 强力优化Rancher k8s中国区的使用体验
  • 一起来学SpringBoot | 第三篇:SpringBoot日志配置
  • RDS-Mysql 物理备份恢复到本地数据库上
  • # Panda3d 碰撞检测系统介绍
  • ## 临床数据 两两比较 加显著性boxplot加显著性
  • #Z0458. 树的中心2
  • #单片机(TB6600驱动42步进电机)
  • $redis-setphp_redis Set命令,php操作Redis Set函数介绍
  • (20050108)又读《平凡的世界》
  • (70min)字节暑假实习二面(已挂)
  • (C语言)strcpy与strcpy详解,与模拟实现
  • (poj1.2.1)1970(筛选法模拟)
  • (Redis使用系列) SpirngBoot中关于Redis的值的各种方式的存储与取出 三
  • (解决办法)ASP.NET导出Excel,打开时提示“您尝试打开文件'XXX.xls'的格式与文件扩展名指定文件不一致
  • (论文阅读26/100)Weakly-supervised learning with convolutional neural networks
  • (免费领源码)python+django+mysql线上兼职平台系统83320-计算机毕业设计项目选题推荐
  • (三)终结任务
  • (十八)三元表达式和列表解析
  • (算法)N皇后问题
  • (原創) 如何解决make kernel时『clock skew detected』的warning? (OS) (Linux)
  • (转)Android学习系列(31)--App自动化之使用Ant编译项目多渠道打包
  • (转)Android中使用ormlite实现持久化(一)--HelloOrmLite
  • (转)树状数组
  • (转载)(官方)UE4--图像编程----着色器开发
  • .bat批处理(七):PC端从手机内复制文件到本地
  • .NET Core6.0 MVC+layui+SqlSugar 简单增删改查