Innodb底层原理与Mysql日志机制深入剖析

news2024/11/29 5:34:59

1.MySQL的内部组件结构

在这里插入图片描述
客户端执行sql语句,这时mysql会把sql语句发给server层连接器,连接器通过账号密码端口号进行连接数据库,验证成功后,然后在权限表里查询相应的权限,然后依赖于此时读取权限,连接器把sql语句发给词法分析器,词法分析分析词是否有问题,没有问题再分析语法有没有问题,没有问题在sql分发给优化器,此时sql语句通过成本计算,是否走索引,没有问题再把sql发给执行进行执行,返回结果给客户端。

1.1.连接器

主要验证客户端账号密码端口号是否正确,验证成功后,会去权限表里面获取对应的权限,比如建表权限,查询权限,修改权限等等。

1.2.查询缓存

客户端执行查询sql,首先查看查询缓存中是否有这个数据,有这个数据将会直接从缓存中取出数据(缓存的数据key-value形式进行存储,key为执行sql语句,value执行的结果值),然后返回给客户端,假如缓存中没有,执行完成后,把执行结果存在查询缓存中。
说明:查询缓存在数据发生更新,插入后查询缓存会被清空,所以查询缓存的命中率十分的低,在my.cnf里面客户设置

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

1.3.分析器

主要分析词法是否正确,语法是否正确,然后生成一个语法树
在这里插入图片描述

1.4.优化器

决定是否走索引,各个表进行关联,决定没有表的连接顺序。

1.5.执行器

查看用户是否执行权限,有权限进行执行,无权限报错。想·

2.Innodb底层原理与Mysql日志机制

在这里插入图片描述
分析:通过主键进行加载,查看缓存池中是否有数据,假如没有缓存池中没有数据,通过读取.idb文件中page页数据读取到buffer pool中(假如没有,这步就不执行,直接向下执行),然后在UNDO日志中保存当前的修改的日志,然后修改buffer pool中的数据,执行器,接着在REDO log buffer中写入日志,然后通过顺序写的形式,写入redo 日志中,主要进行物理修改,接着执行器,执行写binlog日志写入磁盘中,当binlog日志写完后,会在redo日志中打上commit的标识,接着计算机,会在空闲的时候,把buffer pool池中的数据写入到磁盘中。

2.1 redo log重做日志关键参数

2.1.1 innodb_log_buffer_size:

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

show variables like '%innodb_log_buffer_size%';

2.1.2 innodb_log_group_home_dir:

设置redo log文件存储位置参数,默认值为"./",即innodb数据文件存储位置,其中的 ib_logfile0 和 ib_logfile1 即为redo log文件。

show variables like '%innodb_log_group_home_dir%';

在这里插入图片描述

2.1.3 innodb_log_files_in_group:

设置redo log文件的个数,命名方式如: ib_logfile0, iblogfile1… iblogfileN。默认2
个,最大100个。

show variables like '%innodb_log_files_in_group%';

2.1.4 innodb_log_file_size:

设置单个redo log文件大小,默认值为48M。最大值为512G,注意最大值指的是整个 redo
log系列文件之和,即(innodb_log_files_in_group * innodb_log_file_size)不能大于最大值512G。

show variables like '%innodb_log_file_size%';

2.2 redo log 写入磁盘过程分析:

redo log 从头开始写,写完一个文件继续写另一个文件,写到最后一个文件末尾就又回到第一个文件开头循环写,如
下面这个图所示。
在这里插入图片描述
write pos 是当前记录的位置,一边写一边后移,写到第 3 号文件末尾后就回到 0 号文件开头。
check point 是当前要擦除的位置,也是往后推移并且循环的,擦除记录前要把记录更新到数据文件里。
write pos 和 checkpoint 之间的部分就是空着的可写部分,可以用来记录新的操作。如果 write pos 追上
checkpoint,表示redo log写满了,这时候不能再执行新的更新,得停下来先擦掉一些记录,把 checkpoint 推进一下。

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

  • 设置为0:表示每次事务提交时都只是把 redo log 留在 redo log buffer 中,数据库宕机可能会丢失数
    据。
  • 设置为1(默认值):表示每次事务提交时都将 redo log 直接持久化到磁盘,数据最安全,不会因为数据库
    宕机丢失数据,但是效率稍微差一点,线上系统推荐这个设置。
  • 设置为2:表示每次事务提交时都只是把 redo log 写到操作系统的缓存page cache里,这种情况如果数
    据库宕机是不会丢失数据的,但是操作系统如果宕机了,page cache里的数据还没来得及写入磁盘文件的话就
    会丢失数据。

在这里插入图片描述

3 binlog二进制归档日志

binlog二进制日志记录保存了所有执行过的修改操作语句,不保存查询操作。如果 MySQL 服务意外停止,可通过二进制日志文件排查,用户操作或表结构操作,从而来恢复数据库数据。
启动binlog记录功能,会影响服务器性能,但如果需要恢复数据或主从复制功能,则好处则大于对服务器的影响。

show variables like '%log_bin%';

当
当log_bin为off时需要配置my.ini参数

#log‐bin设置binlog的存放位置,可以是绝对路径,也可以是相对路径,这里写的相对路径,则binlog文件默认会放在
data数据目录下
 log‐bin=mysql‐binlog
# Server Id是数据库服务器id,随便写一个数都可以,这个id用来在mysql集群环境中标记唯一mysql服务器,集群环
境中每台mysql服务器的id不能一样,不加启动会报错
server‐id=1
# 其他配置
binlog_format = row # 日志文件格式,下面会详细解释
expire_logs_days = 15 # 执行自动删除binlog日志文件的天数, 默认为0, 表示不自动删除
max_binlog_size = 200M # 单个binlog日志文件的大小限制,默认为 1GB

3.1 binlog日志相关操作

1.存放的位置

一般存放在data目录下,叫mysql-binlog.000001的文件
在这里插入图片描述

2.查看binlog日志里面执行的语句

mysqlbinlog --no-defaults -v --base64-output=decode-rows D:\softWare\mysql\MySQLServer8.0\data\mysql-binlog.000001

在这里插入图片描述

3.binlog日志恢复数据

在这里插入图片描述
在这里插入图片描述

mysqlbinlog --no-defaults --start-position=650 --stop-position=1073 --database=test D:\softWare\mysql\MySQLServer8.0\data\mysql-binlog.000002 | mysql -uroot -proot -v test

在这里插入图片描述
说明:这里根据序号进行恢复,恢复序号之间的数据,–start-position=数据开始,–stop-position=数据结束

mysqlbinlog  --no-defaults --start-datetime="2023-05-29 08:33:23"  --stop-datetime="2023-05-29 08:39:04" --database=test D:\softWare\mysql\MySQLServer8.0\data\mysql-binlog.000002 | mysql -uroot -proot -v test

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
说明:第二种方案,通过时间进行恢复数据。

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

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

相关文章

【项目】Q-ROBOT移动机器人设计与开发

本文主要记录Q-ROBOT移动机器人的开发流程~ github: GitHub - Qsx567/SLAMCarProject (持续更新中~希望各位铁子走过路过给个小小的star!灰常感谢!) 本项目为我设计的移动SLAM机器人,命名为: Q-Robot 机…

【Python Dash】零基础也能轻松掌握的学习路线与参考资料

Python Dash是一个可视化框架,可以帮助开发者快速构建交互式仪表板和应用程序。它基于Plotly.js库建立,提供了一种易于使用的Python界面,用户可以通过简单的Python代码创建仪表板和应用程序。本篇文章将介绍Python Dash的学习路线&#xff0c…

【学习日记2023.5.30】之 订单处理 订单状态定时处理_来单提醒_用户催单

文章目录 10. 订单处理10.1 Spring Task10.1.1 介绍10.1.2 cron表达式10.1.3 入门案例10.1.3.1 Spring Task使用步骤10.1.3.2 代码开发10.1.3.3 功能测试 10.1.4提交代码 10.2 订单状态定时处理10.2.1 需求分析10.2.2 代码开发10.2.3 功能测试 10.3 WebSocket10.3.1 介绍10.3.2…

互联网产品岗

文章目录 产品岗分类工具类社交类内容类平台类 职级划分工作流程refer: 产品岗分类 注:产品岗的分类并不绝对,因为大部分的产品都有符合属性,这里的分类主要便于理解(越写越觉得很多东西没得分) 工具类 定义&#x…

MySQL查询当前数据和上一行数据比较、业务数据的趋势分析、数据变动的监控和报警

标题: 使用MySQL查询当前数据和上一行数据比较的场景 在MySQL中,我们经常需要对数据进行比较和分析。其中一种常见的需求是查询数据列表并与前一行的数据进行比较。这种场景可以通过使用窗口函数或连接来实现。本文将介绍使用MySQL查询比较数据和上一行数据的场景&a…

【Unity Shader】Plane实现风格化水

写在前面 长文警告!!!!! 很久没更新博客了,,这次是要做一个风格化水效果,是基于Plane着色实现水面效果。 项目:Unity 2017.4.40f1 Build-in,因此实现过程会…

ChatGPT vs Google:谁是答案之王?微软揭示未来搜索的样子

已经习惯了网购的你,有没有想过一旦电子商务行业遭受重创,会对我们的日常生活造成什么影响呢? 我们已经习惯了在生活中碰到什么不懂的事情就 Google 一下或者百度一下,甚至许多人的职业都跟 Google 密切相关,比如自媒…

从外包到转岗华为正式员工月薪17K,这一百多天的心酸谁能懂.....

本人毕业于某普通二本院校非计算机专业,跨专业入行测试,至今有近 5年工作经验。 第一份测试工作是在华为做了两年外包。总体感受就是 这份工作缺乏归属感,心里总有一种落差,进步空间不大, 接触不到核心技术&#xf…

跨端框架+小程序容器:一种让App开发提高效率的思路

WePY(微信小程序开发框架)是一个基于组件化开发思想的微信小程序开发框架。它类似于Vue.js框架,通过封装小程序原生的API,提供了更加简洁、高效的开发方式。 WePY的主要特点包括: 组件化开发:WePY将页面拆…

matplotlib常用功能汇总

文章目录 1.IDE里的1.1 显示模式(plt.ion()和plt.ioff())1.2 backend说明 2 jupyter里的3 通用的3.1 cmap3.2 subplot()相关3.3 绘制动态图(Animation类)3.4 matplotlib利用rcParams配置样式参数 4. 与opencv连用可能遭遇的问题1.…

MySQL_8 相当牛逼的索引机制

目录 一、索引机制的引入 1.索引机制🐂B在哪里? 2.索引机制提高查询速度的原理 : 二、索引的创建 1.索引分类 : 2.使用格式 : 3.代码演示 : 三、索引的删除 1.格式 : 2.演示 : 四、索引的查询 1.格式 : 2.演示 : 五、索引的使用规则 一、索…

Linux---强制停止、退出登出、history、yum

1. ctrl c 强制停止 Linux某些程序的运行,如果想要强制停止它,可以使用快捷键ctrl c: [shaonianlocalhost ~]$ tail ^C [shaonianlocalhost ~]$ 命令输入错误,也可以通过快捷键ctrl c,退出当前输入,重…

如何在 Alpine Linux 上启用或禁用防火墙?

防火墙是计算机网络安全的重要组成部分,它用于保护计算机和网络免受未经授权的访问和恶意攻击。Alpine Linux 是一种轻量级的 Linux 发行版,常用于构建容器化应用和嵌入式系统。本文将详细介绍如何在 Alpine Linux 上启用或禁用防火墙。步骤 1&#xff1…

MySQL复习

文章目录 1、操作数据库1.1、操作数据库1.2、数据库的数据类型1.3、数据库的字段属性1.4、创建数据表1.5、MyISAM和InnoDB1.6、修改删除表 2、MySQL数据管理2.1、外键2.2、DML语言(全部记住)2.3、添加2.4、修改2.5、删除 3、DQL查询数据3.1、DQL3.2、查询…

EMPIRE: LUPINONE实战演练

文章目录 EMPIRE: LUPINONE实战演练一、前期准备1、相关信息 二、信息收集1、端口扫描2、访问网站3、查看源码4、dirsearch扫描目录5、访问robots文件6、访问myfiles文件7、模糊测试8、访问秘密文件9、查找秘钥10、查看秘钥11、解码12、解密13、远程连接 三、提权1、查找flag2、…

Unity---委托与事件

目录 1.委托和事件在使用上的区别是什么? 2. delegate委托 2.1示意图 2.2 DelegetTest.cs 2.3 Deleget_A.cs 2.4 Deleget_B.cs 2.5 运行unity. 点击按键 A 2.6 点击按键 B 3.Event 事件 3.1单个通知 3.1.1示意图 3.1.2 Event_Test.cs 3.1.3 Event_A.cs 3…

专家警告AI可能会导致人类灭绝

人工智能可能导致人类灭绝,包括 OpenAI 和 Google Deepmind 负责人在内的专家警告说 数十人支持在人工智能安全中心 的网页上发表的声明。 它写道:“减轻人工智能灭绝的风险应该与其他社会规模的风险(如流行病和核战争)一起成为全…

Spring(二)获取bean和依赖注入

一、获取bean的三种方式: 1.根据bean的id获取: Student studentOne (Student) ioc.getBean("studentOne"); 2.获取bean所需要的类型的class对象: Student student ioc.getBean(Student.class); 我们运行之后如下所示&#xff1…

为kong网关添加限流插件

限流用于控制发送到上游服务的请求速率。 它可用于防止 DoS 攻击、限制网络抓取和其他形式的过度使用。 如果没有速率限制,客户可以无限制地访问您的上游服务,这可能会对可用性产生负面影响。 一、全局范围内的限流 1、启用限流 [rootmin ~]# curl -i…

AI落地:儿童节贺卡

昨天有个朋友Lisa找到我,她是幼儿园的老师,看到我最近搞了个爱落地星球,在研究各行各业AI落地的事情,问我能不能用AI帮她写一百多张贺卡。 说起来写贺卡,我只会写“节日快乐”。现在有了ChatGPT,那就大不一…