innodb底层原理和MySQL日志机制

server层

1. 连接器

客户端连接数据库需要输入账号、密码。连接器进行校验账号密码以及权限。

2. 查询缓存

连接器连接以后,比如输入一个select语句,这时候第一步就会先根据sql语句作为key给查询缓存中查看这条sql有没有已经被查询过,如果有直接返回,如果没有就接着到分析器。查询缓存是以key-value的形式存在的。

MySQL8版本是没有查询缓存的,因为存入缓存其实是很耗费性能的,比如一张表,当查询语句查询完成以后那么就会将对应的数据和sql放到查询缓存中,但是如果有其他操作需要更新这个表,就会将查询缓存删除掉,重新等待其他查询查完以后再放到缓存中,等到更新又删除,但是表如果不是那种字典表不经常修改数据的话,其他表就要频繁删除缓存,基本就相当于用不上查询缓存。而且缓存也有像redis这种。

查询缓存的三种策略设置

 my.cnf
 #query_cache_type有3个值 0代表关闭查询缓存OFF,1代表开启ON,2(DEMAND)代表当sql语句中有SQL_CACHE关键
词时才缓存
 query_cache_type=2

3. 分析器

输入的sql语句分析器会进行分析,分析完成的sql会做成一个语法树。比如select * fro table; 其中应该是from但是输入了fro那么分析器就会分析出来语法不对。

4. 优化器

会根据sql进行优化,比如联合查询left 会决定执行那张表。比如会决定走不走索引,以及成本计算和成本比较决定走什么方式最好。

5. 执行器

调用搜索引擎,正式开始操作。但是之前会先判断有没有权限,如果走的查询缓存会在返回结果的时候校验权限。然后再去调用比如innodb搜索引擎

innodb

操作一条数据执行器操作innodb流程

这个图片代表一整个更新语句的执行流程。

  1. 连接器校验权限和账号密码
  2. 进入到分析器分析语法的准确性
  3. 优化器 优化sql 成本计算
  4. 执行器调用innodb引擎
  5. 查询buffer pool中有没有该数据,如果没有从ibd磁盘文件中将这条数据对应的 一页数据拿出来(一页数据在b+tree是16 kb)放到缓存buffer pool
  6. 将更新前的旧址放到undolog 作用就是留作 回滚以及mvcc
  7. 更新内存的值 这时候并没有真正更新磁盘文件只是更新的缓存
  8. 更新redolog 先把数据更新到redolog对应的缓存中,再去顺序写到redolog磁盘文件中 方便持久化数据 即使提交数据 之后 数据库宕机ibd文件更新到最新数据也可以重启以后根据redolog恢复数据
  9. 更新binlog 方便恢复数据,比如不小心删除了数据可以根据binlog记录的sql日志恢复数据
  10. redolog 和 binlog都执行完成以后提交事务
  11. 系统空闲时就给ibd磁盘文件更新一次数据

undolog

用作日志版本链,方便回滚。以及mvcc做事务的隔离性。这个笔记有

此处为语雀内容卡片,点击链接查看:MySQL锁机制与优化实践 · 语雀

redolog

数据存储到这个文件是为了保证如果数据库宕机还能将buffer pool没更新到ibd文件的数据重新更新到磁盘中。

比如数据更新到redolog和binlog中这时候事务已经提交了,但是有一个线程是隔一段时间才会从buffer pool把新数据对应的一页数据更新到ibd文件,这时候还没有更新数据库宕机了。就会导致事务也提交了,ibd数据也没来得及更新。但是redolog是可以重启以后接着给ibd同步更新过的数据。

binlog

存储每一次执行的sql语句,能用做恢复数据。

比如不小心把表中数据删除了几行,这时候可以去这个文件将删除之前的sql语句跑一遍就能恢复

redolog的buffer 参数设置

innodb_log_buffer_size:设置redo log buffer大小参数,默认16M ,最大值是4096M,最小值为1M。

1 show variables like '%innodb_log_buffer_size%';

innodb_log_group_home_dir:设置redo log文件存储位置参数,默认值为"./",即innodb数据文件存储位置,其

中的 ib_logfile0 和 ib_logfile1 即为redo log文件。

1 show variables like '%innodb_log_group_home_dir%';

innodb_log_files_in_group:设置redo log文件的个数,命名方式如: ib_logfile0, iblogfile1... iblogfileN。默认2

个,最大100个。

1 show variables like '%innodb_log_files_in_group%';

innodb_log_file_size:设置单个redo log文件大小,默认值为48M。最大值为512G,注意最大值指的是整个 redo

log系列文件之和,即(innodb_log_files_in_group * innodb_log_file_size)不能大于最大值512G。

1 show variables like '%innodb_log_file_size%';

redolog写入磁盘的详细过程

redolog有好几个,其实他们是循环写的,当一个文件写满了设置的最大存储量,就会换另外一个,形成一个闭环,当都写满了就会前边清理之前数据,后面写着新数据。清理的数据其实都是已经让线程同步到ibd文件中数据。

write pos是代表需要新的数据写入的起始位置。

check point 代表需要删除的数据起始位置

当write pos 快要和check point 重叠时,check point 就会开始清除历史数据,清楚之前会让线程把这些清理的数据同步到ibd文件中。

redolog的写入策略设置

innodb_flush_log_at_trx_commit:这个参数控制 redo log 的写入策略,它有三种可能取值:

设置为0:表示每次事务提交时都只是把 redo log 留在 redo log buffer 中,数据库宕机可能会丢失数

据。

设置为1(默认值):表示每次事务提交时都将 redo log 直接持久化到磁盘,数据最安全,不会因为数据库

宕机丢失数据,但是效率稍微差一点,线上系统推荐这个设置。

设置为2:表示每次事务提交时都只是把 redo log 写到操作系统的缓存page cache里,这种情况如果数

据库宕机是不会丢失数据的,但是操作系统如果宕机了,page cache里的数据还没来得及写入磁盘文件的话就

会丢失数据。

InnoDB 有一个后台线程,每隔 1 秒,就会把 redo log buffer 中的日志,调用 操作系统函数 write 写到文件系统的

page cache,然后调用操作系统函数 fsync 持久化到磁盘文件。

redo log写入策略参看下图:

binlog的文件内容记录三种格式

用参数 binlog_format 可以设置binlog日志的记录格式,mysql支持三种格式类型:

STATEMENT:基于SQL语句的复制,每一条会修改数据的sql都会记录到master机器的bin-log中,这种 方式日志量小,节约IO开销,提高性能,但是对于一些执行过程中才能确定结果的函数,比如UUID()、 SYSDATE()等函数如果随sql同步到slave机器去执行,则结果跟master机器执行的不一样。

ROW:基于行的复制,日志中会记录成每一行数据被修改的形式,然后在slave端再对相同的数据进行修改记录下每一行数据修改的细节,可以解决函数、存储过程等在slave机器的复制问题,但这种方式日志量较 大,性能不如Statement。举个例子,假设update语句更新10行数据,Statement方式就记录这条update语句,Row方式会记录被修改的10行数据。

MIXED:混合模式复制,实际就是前两种模式的结合,在Mixed模式下,MySQL会根据执行的每一条具 体的sql语句来区分对待记录的日志形式,也就是在Statement和Row之间选择一种,如果sql里有函数或一些

在执行时才知道结果的情况,会选择Row,其它情况选择Statement,推荐使用这一种。

binlog写入磁盘的过程

binlog写入的方式比如是row方式,首先会将数据存储到操作系统(windows这种)中的page cache中,就自认为是完成了,就相当于是rabbitmq这种异步,生产者将数据丢给mq就认为自己已经成功了,这个是将数据丢给page cache中,每隔一段时间(时间看系统心情)会将page cache的数据刷到binlog文件中。

通过binlog数据恢复

 # 查看bin‐log二进制文件(命令行方式,不用登录mysql)
 mysqlbinlog ‐‐no‐defaults ‐v ‐‐base64‐output=decode‐rows D:/dev/mysql‐5.7.25‐winx64/data/mysql‐bi
nlog.000007

 # 查看bin‐log二进制文件(带查询条件)
 mysqlbinlog ‐‐no‐defaults ‐v ‐‐base64‐output=decode‐rows D:/dev/mysql‐5.7.25‐winx64/data/mysql‐bi
nlog.000007 start‐datetime="2023‐01‐21 00:00:00" stop‐datetime="2023‐02‐01 00:00:00" start‐
position="5000" stop‐position="20000"

可以根据时间段来执行,也可以根据每一个SQL执行前后的上下文类似于上下文标识id一样去执行。

mysql的innodb这套机制这么复杂有什么好处呢?

  1. 首先可以顺序读写,直接将数据顺序写放到redolog中。
  2. 数据更新基本都是在缓存中的,比直接操作磁盘文件要快

顺序写是什么?

比如有 一个事务 需要对10张表进行10个sql语句的更新,如果直接更新到ibd磁盘文件,那么就会导致来回的找表,找到表再去更新,循环反复10次。

而MySQL的顺序写将操作记录到redolog中,将需要操作都一次往后写到redolog中就完事儿了,再有空余线程去执行buffer pool刷新到ibd磁盘文件。这样就性能很快,10个表10个更新只需要写到一个redolog文件即可

page cache是什么?

就是计算机的操作系统自己会有一个开辟的空间,目的是为了防止内存和磁盘频繁交互。可以将需要的操作放到page cache中,等到操作系统统一去执行。就类似于mq这种,生产者将数据直接丢到队列中就完事儿了,就认为操作成功了,其他事情不需要自己关系。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于Guava布隆过滤器的海量字符串高效去重实践

在Java环境中处理海量字符串去重的问题时,布隆过滤器(BloomFilter)是一种非常高效的数据结构,尽管它有一定的误报率。布隆过滤器适用于那些可以接受一定误报率,并且希望节省空间和时间成本的场景。 布隆过滤器应用 使…

爬取的数据可以入表吗?怎样入表?

合规是数据入表的前提。当前爬虫数据是非常敏感的,因为爬虫极容易造成两大不合规的问题:一是没有经过个人同意获取数据,二是爬取的数据里可能含有个人敏感信息也是一个问题。现在法律对于这部分非常严苛,如果企业里有50条未获得授…

优先级队列(堆)详解

优先级队列(堆)详解 目录 堆的概念堆的存储方式堆的基本操作优先级队列模拟实现PriorityQueue接口介绍堆排序Top-k问题 1、堆的概念 如果有一个关键码的集合K {k0,k1, k2,…,kn-1},把它的所…

动态规划—— 求最长不下降序列LIS【集训笔记】

题目描述 设有由n(1≤n≤200)个整数组成的数列&#xff0c;记为:b(1)、b(2)、……、b(n)&#xff0c;若存在i1<i2<i3<…<ie 且有b(i1)<b(i2)<…<b(ie)则称为长度为e的不下降序列。程序要求&#xff0c;当原数列出之后&#xff0c;求出最长的不下降序列。 …

仰暮计划|“她告诉我,大部分时间她都是一个家庭主妇,负责照料家务和小孩,但她从来没有停止她对知识的追求”

我来到河南省开封市兰考县南北庄村内一个宁静而温馨的小院子&#xff0c;那里居住着一位九十多岁的高龄老人&#xff0c;她就是张奶奶。张奶奶是村里的一位高龄老人&#xff0c;拥有着丰富的人生经历。我对她的故事非常充满好奇&#xff0c;所以特地来到张奶奶的家中&#xff0…

5.Nacos注册中心

5.Nacos注册中心 国内公司一般都推崇阿里巴巴的技术&#xff0c;比如注册中心&#xff0c;SpringCloudAlibaba也推出了一个名为Nacos的注册中心。 5.1.认识和安装Nacos Nacos是阿里巴巴的产品&#xff0c;现在是SpringCloud中的一个组件。相比Eureka功能更加丰富&#xff0c…

【加解密篇】电子数据取证分析之特殊的自加密BitLocker解密

【加解密篇】电子数据取证分析之特殊的自加密BitLocker解密 数据加解密通常是个耗时费力的事情—【蘇小沐】 1、实验环境 Windows 11 专业版&#xff0c;[23H2&#xff08;22631.3007&#xff09;] &#xff08;一&#xff09;自动开启BitLocker之天坑 1、经验之谈 在201…

常用电子器件学习——MOS管

MOS管介绍 MOS&#xff0c;是MOSFET的缩写。MOSFET 金属-氧化物半导体场效应晶体管&#xff0c;简称金氧半场效晶体管&#xff08;Metal-Oxide-Semiconductor Field-Effect Transistor, MOSFET&#xff09;。 一般是金属(metal)—氧化物(oxide)—半导体(semiconductor)场效应晶…

尝试为ssrf漏洞编写黑名单与白名单

以pikachu靶场ssrf&#xff08;curl&#xff09;为例&#xff1a; 你会发现什么也没防御项访问基本的文件内容&#xff0c;端口开放都是可以看到的&#xff0c;没有任何防御措施。 我们去查看一下他的源码有没有过滤什么 没有任何过滤&#xff0c;咱么尝试进行过滤一下&#xf…

P9232 [蓝桥杯 2023 省 A] 更小的数

[蓝桥杯 2023 省 A] 更小的数 终于本弱一次通关了一道研究生组别的题了[普及/提高−] 一道较为简单的双指针题,但一定有更好的解法. 题目描述 小蓝有一个长度均为 n n n 且仅由数字字符 0 ∼ 9 0 \sim 9 0∼9 组成的字符串&#xff0c;下标从 0 0 0 到 n − 1 n-1 n−1&a…

防御第二次作业-防火墙组网实验(2)

目录 实验拓扑图 实验要求 一般组网步骤 to isp区域ping通 dmz区域 trust区域 实验拓扑图 实验要求 1.防火墙向下使用子接口分别对应两个内部区域 2.所有分区设备可以ping通网关 一般组网步骤 1.先配ip、接口、区域、安全策略 2.内网配置回包路由 3.配置dmz区域的服务器映…

工业物联网水泵远程监控系统解决方案

行业描述 水泵作为一种应用极为广泛的通用机械&#xff0c;在工业生产、日常生活中发挥着重要作用&#xff0c;伴随着“十三五”期间重大工程泵类产品的国产化率的提高&#xff0c;当前已经基本满足了国家经济建设发展的需要。 近年来中国水泵企业实现了较大的技术提升&#…

JavaWeb之开发介绍 --黑马笔记

什么是 Web &#xff1f; Web&#xff1a;全球广域网&#xff0c;也称为万维网(www World Wide Web)&#xff0c;能够通过浏览器访问的网站。 Web 网站的工作流程 上图解释&#xff1a; 当你在浏览器中输入网址或点击一个链接时&#xff0c;浏览器会向前端服务器发起请求&…

一文让你了解UI自动化测试

测试都起什么作用 - 是项目的保险&#xff0c;但不是项目的救命草&#xff1b;测试无实际产出&#xff0c;但作用远大于实际产出&#xff1b;测试是从项目维度保证质量&#xff0c;而不是测试阶段。 UI自动化&#xff08;下面简称自动化&#xff09; - 基于UI进行自动功能测试…

贪心算法详解

文章目录 前言一、什么是贪心算法二、贪心算法的特点1.贪心策略的提出2.贪心策略的正确性 三、学习贪心算法的方向总结 前言 在本次文章中我们将会详细介绍贪心算法的相关内容 一、什么是贪心算法 贪心算法&#xff1a;在解决问题时&#xff0c;每一步都选择最优解&#xff0…

K8s(九)持久化存储PV与PVC

PV和PVC PV 和 PVC 之间的关系是一种动态的供需匹配关系。PVC 表示应用程序对持久化存储的需求&#xff0c;而 PV 表示可用的持久化存储资源。Kubernetes 控制平面会根据 PVC 的需求来选择和绑定合适的 PV&#xff0c;将其挂载到应用程序的 Pod 中&#xff0c;从而使应用程序可…

Mock大法:Fake it till u make it!

在单元测试时&#xff0c;我们希望测试环境尽可能单纯、可控。因此我们不希望依赖于用户输入&#xff0c;不希望连接无法独占的数据库或者第三方微服务等。这时候&#xff0c;我们需要通 mock 来模拟出这些外部接口。mock 可能是单元测试中最核心的技术。 无论是 unittest 还是…

【DeepLearning-1】 注意力机制(Attention Mechanism)

1.1注意力机制的基本原理&#xff1a; 计算注意力权重&#xff1a; 注意力权重是通过计算输入数据中各个部分之间的相关性来得到的。这些权重表示在给定上下文下&#xff0c;数据的某个部分相对于其他部分的重要性。 加权求和&#xff1a; 使用这些注意力权重对输入数据进行加权…

Flink(十五)【Flink SQL Connector、savepoint、CateLog、Table API】

前言 今天一天争取搞完最后这一部分&#xff0c;学完赶紧把 Kafka 和 Flume 学完&#xff0c;就要开始做实时数仓了。据说是应届生得把实时数仓搞个 80%~90% 才能差不多找个工作&#xff0c;太牛马了。 1、常用 Connector 读写 之前我们已经用过了一些简单的内置连接器&#x…

用ChatGPT教学、科研!大学与OpenAI合作

亚利桑那州立大学&#xff08;简称“ASU”&#xff09;在官网宣布与OpenAI达成技术合作。从2024年2月份开始&#xff0c;为所有学生提供ChatGPT企业版访问权限&#xff0c;主要用于学习、课程作业和学术研究等。 为了帮助学生更好地学习ChatGPT和大语言模型产品&#xff0c;AS…