MySQL深入——14

Mysql是如何保证数据不全的,Mysql的数据写入是两阶段提交完成的,即为redo log的prepare阶段和bin log阶段还有redo log的commit阶段,那么数据就和redo log 和bin log 有关。

我们来看看bin log 和redo log的写入机制

bin log

bin log的写入逻辑较为简单

在事务执行过程当中,先将日志写入到binlog cache,事务commit时,再将binlog cache写入到bin log文件当中。

一个事务的bin log是不能被拆开的,无论其有多大,也要确保一次写入,因为bin log是由binlog cache一次写入的,这也就确保了binlog cache是不能被拆开的,这就涉及到了binlog cache的保存方式。

系统给binlog cache分配了一块内存,每个线程一个,参数bin_log_cache_size用于控制单个线程中的binlog cache所占内存的大小,如果超出范围,就会暂存于磁盘当中。

每个线程都有自己的binlog cache文件,但是共用一个bin log文件。binlog cache先write到bin log当中在fsync到disk中。write指将日志写入到系统文件的page cache当中,并没有把数据持久化到磁盘当中,fsync是将数据持久化到磁盘的操作,占磁盘的IOPS(IOPS主要衡量单位时间内系统能处理的I/O请求数量,而数据吞吐量则指单位时间内可以成功传输的数据数量。)。

write和fsync的时机由参数sync_binlog控制。

当这个参数等于0的时候,每次事务只会write不会fsync

等于1的时候都会fsync

等于N的时候都会write当事务数量达到N的时候会将其fsync到磁盘当中。

将sync_binlog设置为较大值的时候可以提示性能,因为一次写入了很多文件。但是坏处在于当机器异常重启的时候,会丢失最近N个事务的binlog。

Redo log

我们之前了解过redo log buffer,事务在执行过程当中,生成的redo log是要写入到redolog buffer中的,那么redo log buffer的内容是不是每次生成后都要持久化到磁盘当中呢?

不对,在这期间,如果Mysql发生了异常重启,这部分的日志就会丢失,但是由于事务没有commit,所以丢失了也不会有损失。那么没有提交事务的时候,redo log buffer的部分日志会持久化到磁盘当中吗,答案是会,这和redo log的三种状态有关,分别是redo log buffer,page cache,hard disk。

日志写入到redo log buffer当中是很快的,write到page cache中也差不多,但是持久化到磁盘当中就很慢了。为了控制其写入策略,InnoDB提供了innodb_flush_log_at_trx_commit的参数。当它等于0的时候只是将redo log留在redo log buffer当中,等于1的时候会直接持久化到磁盘当中,等于2的时候会write到page cache当中。

Innodb当中有一个线程,每隔一秒就会把redo log buffer当中的日志调用write写入到page cache当中,然后调用fsync持久化到磁盘中。

事务执行过程在的redo log也是写在redo log buffer当中的,这些redo log也会被后台线程一起持久化到磁盘当中,也就是说没有提交的redo log中的部分日志是会被写入到磁盘当中的。

事实上除了这种情况,还有两种情况导致这种情况

1.redo log buffer占用空间达到innodb_log_buffer_size一半的时候,会自动写盘。

2. 并行的事务提交的时候会写盘,比如将innodb_flush_log_at_trx_commit参数设计为1,B线程提交的时候,会顺带将A线程持久化就算它还没提交。

如果把参数设置为1,在两阶段提交当中,redo log在prepare阶段就会持久化一次,崩溃恢复机制是要依靠prepare的redo log再加上bin log来恢复的,每一秒的后台刷新再加上这个机制,Innodb就会认为redo log再commit阶段不需要fsync,只需要write即可。

Mysql的双1配置就是innodb_flush_log_at_trx_commit等于1和sync_binlog等于1,会有两次刷盘,一次是在redo log prepare阶段,一次是bin log阶段。

TPS(Transaction Per Second)事务数/秒

Mysql为了提供TPS做了一个优化,就是拖时间,为了让fsync一次持久化的数据更大,他进行了下面的操作

1. redo log prepare (write)

2. bin log (write)

3.redo log prepare(fsync)

4.bin log(fsync)

5.redo log commit(write)

这样处理下来再第三步的时候,就会fsync bin log 和redo log 的数据,那么到第四步的时候能持久化报错的bin log数据就很少了,所以bin log(fsync)的效果不如 redo log prepare(fsync)。

你如果要提高bin log(fsync)的能力,可以使用binlog_group_commit_sync_delay表示等待多少微秒后调用fsync。binlog_group_commit_sync_no_delay_commit表示在积累多少次后调用fsync。

那么在优化的时候就可以考虑sync_binlog设置为N,将binlog_group_commit_sync_delay和binlog_group_commit_sync_no_delay_commit调高。再或者将innodb_flush_log_at_trx_commit设置为2,因为它会每一秒自动写入磁盘的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/635367.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

鸿蒙开发系列教程(四)--ArkTS语言:基础知识

1、ArkTS语言介绍 ArkTS是HarmonyOS应用开发语言。它在保持TypeScript(简称TS)基本语法风格的基础上,对TS的动态类型特性施加更严格的约束,引入静态类型。同时,提供了声明式UI、状态管理等相应的能力,让开…

商铺对外出租招标标书

随着市场经济的蓬勃发展,商铺对外出租已成为一种普遍的商业模式。对于房东或业主而言,通过招标方式出租商铺不仅可以提高租金收益,更能确保商铺的稳定租户。 一、招标标书的基本要素 1. 项目概述:简要介绍商铺的位置、面积、装修…

2023华数杯国际赛A题核废水40页完整高质量原创论文

大家好,从昨天肝到现在,终于完成了本次华数杯国际赛数学建模A题的完整论文了。 给大家看一下目录吧: 目录 摘 要: 10 一、问题重述 12 二.问题分析 13 2.1问题一 13 2.2问题二 13 2.3问题三 13 2.4问题四 13 …

GetShell的姿势

0x00 什么是WebShell 渗透测试工作的一个阶段性目标就是获取目标服务器的操作控制权限,于是WebShell便应运而生。Webshell中的WEB就是web服务,shell就是管理攻击者与操作系统之间的交互。Webshell被称为攻击者通过Web服务器端口对Web服务器有一定的操作权…

javaWebssh运动会管理系统myeclipse开发mysql数据库MVC模式java编程计算机网页设计

一、源码特点 java ssh运动会管理系统是一套完善的web设计系统(系统采用ssh框架进行设计开发),对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为TOMCAT7.0,M…

Beyond Compare ubuntu 安装

文章目录 参考 具体方法请参考【1】、【2】,亲测有效。 参考 【1】deepin深度系统 BeyondCompare 4.3.4破解教程 【2】Beyond-Compare 4 -linux 破解

Java医药WMS进销存系统

技术架构: jdk8 IntelliJ IDEA maven Mysql5.7 有需要的可以私信我。 系统功能与介绍: 医药进销存系统,主要分两种角色:员工、客户。本系统具有进销存系统的通用性,可以修改为其它进销存系统,如家电进…

Git tag使用

tag常被称作里程碑,发版Release时用到。 怎么添加tag? 问 : 刚修改完代码 还未 Commit 可以直接 git tag v2.4.6.1 -m "[Update]更新proxy379ac539"吗? 答: 不可以,git tag 命令是用来给已经存…

windows虚拟主机和linux虚拟主机的区别有哪些?

很多个人站长和中小企业在做网站的时候,会选择虚拟主机。虚拟主机用的操作系统多为Windows系统,很多人一提到操作系统立马联想到Windows系统。其实除了Windows系统外,还有很多的操作系统。其中Linux系统是其中的佼佼者。 1、操作系统 window…

JUC并发编程-线程和进程、Synchronized 和 Lock、生产者和消费者问题

1、什么是JUC 源码 官方文档 面试高频问! java.util 工具包、包、分类 业务:普通的线程代码 Thread Runnable Runnable 没有返回值、效率相比入 Callable 相对较低! 2、线程和进程 线程、进程,如果不能使用一句话说出来的技术…

Python基础数据结构和操作

一、字符串 一. 认识字符串 字符串是 Python 中最常用的数据类型。我们一般使用引号来创建字符串。创建字符串很简单&#xff0c;只要为变量分配一个值即可。 a hello world print(type(a))注意&#xff1a;控制台显示结果为<class str>&#xff0c; 即数据类型为str…

创建SERVLET

创建SERVLET 要创建servlet,需要执行以下任务: 编写servlet。编译并封装servlet。将servlet部署为Java EE应用程序。通过浏览器访问servlet。编写servlet 要编写servlet,需要扩展HttpServlet接口的类。编写servlet是,需要合并读取客户机请求和返回响应的功能。 读取和处…

Qt 状态机框架:The State Machine Framework (二)

传送门: Qt 状态机框架:The State Machine Framework (一) Qt 状态机框架:The State Machine Framework (二) 1、利用并行态避免态的组合爆炸 假设您想在单个状态机中对汽车的一组互斥属性进行建模。假设我们感兴趣的属性是干净与肮脏,以及移动与不移动。需要四个相互排斥的…

从0开始python学习-51.pytest之接口加密封装

目录 MD5加密 base64加密 rsa加密 MD5加密 1. 封装加密方法 def md5_encode(self,data):data str(data).encode("utf-8")md5_data hashlib.md5(data).hexdigest()return md5_data 2. 写入需要使用加密的接口yaml用例 -request:method: posturl: http://192.168.…

去掉element-ui的el-table的所有边框+表头+背景颜色

实例: 1.去掉table表头(加上:show-header"false") <el-table:data"tableData":show-header"false"style"width: 100%"> </el-table> 2.去掉table所有边框 ::v-deep .el-table--border th.el-table__cell, ::v-deep .el…

Java数据结构与算法:排序算法之快速排序

Java数据结构与算法&#xff1a;排序算法之快速排序 大家好&#xff0c;我是免费搭建查券返利机器人赚佣金就用微赚淘客系统3.0的小编&#xff0c;大家都知道&#xff0c;冬天来了&#xff0c;虽然温度逐渐下降&#xff0c;但对于我们这群程序猿而言&#xff0c;风度永远不能减…

【人工智能平台】ubuntu22.04.3部署cube-studio

简介&#xff1a;本次安装是在虚拟机上进行&#xff0c;需要给虚拟机至少分配16GB&#xff0c;分配8GB时系统会卡死。 一、环境&#xff1a; 主机环境&#xff1a;win11&#xff08;全程科学&#xff09;vm虚拟机 虚拟机&#xff1a;ubuntu22.04.3桌面版&#xff08;新装&…

Python并发与多线程:线程理论基础、同步互斥基本原理

并发是指两个或多个事件在同时发生&#xff0c;而多线程是一种实现并发的方式。在Python中&#xff0c;可以使用threading模块来实现多线程。 线程的理论基础是进程&#xff0c;进程是操作系统进行资源分配和调度的基本单位。每个进程都有自己的内存空间&#xff0c;包括代码段…

What is `XSS` does?

跨站脚本攻击&#xff08;Cross-Site Scripting&#xff0c;XSS&#xff09;是一种针对网站应用程序的安全漏洞&#xff0c;允许攻击者将恶意脚本注入到其他用户查看的网页中。当这些用户访问受感染的页面时&#xff0c;他们的浏览器会执行这些恶意脚本&#xff0c;导致各种安全…

Linux tftp命令教程:文件传输利器(附案例详解和注意事项)

Linux tftp命令介绍 tftp&#xff0c;全称为Trivial File Transfer Protocol&#xff08;简单文件传输协议&#xff09;。tftp是一个用于文件传输的客户端命令&#xff0c;用于从远程主机传输文件&#xff0c;包括一些非常简洁、通常嵌入的系统。 Linux tftp命令适用的Linux版…