【MySQL】Innodb存储引擎之物理存储结构(MySQL专栏启动)

news2024/12/23 5:07:52

📫作者简介:小明java问道之路,专注于研究 Java/ Liunx内核/ C++及汇编/计算机底层原理/源码,就职于大型金融公司后端高级工程师,擅长交易领域的高安全/可用/并发/性能的架构设计与演进、系统优化与稳定性建设。

        

📫 热衷分享,喜欢原创~ 关注我会给你带来一些不一样的认知和成长。

        

🏆 CSDN博客专家/后端领域优质创作者/内容合伙人、InfoQ签约作者、阿里云专家/签约博主、51CTO专家 🏆

        

🔥如果此文还不错的话,还请👍关注、点赞、收藏三连支持👍一下博主~ 


专栏系列(点击解锁)

学习路线(点击解锁)

知识定位

🔥MySQL从入门到精通🔥

MySQL从入门到精通

全面讲解MySQL知识与实战

🔥计算机底层原理🔥

深入理解计算机系统CSAPP

构件计算机体系和计算机思维

Linux内核源码解析

围绕Linux内核讲解计算机底层原理与并发

🔥数据结构与企业题库精讲🔥

数据结构与企业题库精讲

结合工作经验深入浅出,适合各层次,笔试面试算法题精讲

🔥互联网架构分析与实战🔥

企业系统架构分析实践与落地

行业前沿视角,专注于技术架构升级路线、架构实践

互联网企业防资损实践

金融公司的防资损方法论、代码与实践。

本文目录

本文目录

本文导读

一、Innodb物理存储结构

二、表空间(Tablespaces)

1、系统表空间(The System Tablespace)

2、独立表空间(File-Per-Table Tablespaces)

3、通用表空间(General Tablespaces)

4、撤销表空间(Undo Tablespaces)

5、临时表空间(Temporary Tablespaces)

三、表结构文件(数据字典 InnoDB Data Dictionary)

四、双写缓冲区(Doublewrite Buffer)

五、日志文件(Log)

1、重做日志(Redo Log)

2、撤销日志(Undo Logs)

3、错误日志(error log)

4、二进制日志(bin log)

5、慢查询日志(Slow Query Log)

6、全量日志(general log)

7、中继日志(relay log)

总结


本文导读

在 InnoDB 存储引擎中,存储结构分为逻辑结构和物理结构,本文详细讲解Innodb的物理结构,包括表空间(独立表空间、共享表空间)、日志文件组(重做文件组)和表结构定义文件组成,及其细节。

同时本文也是对前面文章的一个补充,结合使用效果更佳:《高性能高可用设计实战-索引篇》、《MVCC详解与MVCC实现原理》、《MySQL日志系统以及InnoDB背后的技术》、《Innodb存储引擎逻辑存储结构与底层实现解析》。

一、Innodb物理存储结构

从物理上讲,InnoDB由表空间(独立表空间、共享表空间)、日志文件组(重做文件组)和表结构定义文件组成。在物理可以认为就是InnoDB磁盘。

InnoDB磁盘由五部分组成:表空间(Tablespaces)、InnoDB数据字典(InnoDB Data Dictionary)、Doublewrite缓冲区(Doublewrite Buffer)、重做日志(Redo Log)和撤消日志(Undo Log)

二、表空间(Tablespaces)

Innodb 存储引擎其数据根据表空间进行管理。

表空间用于存储表结构和数据。表空间可分为系统表空间、独立表空间、通用表空间、临时表空间、撤消表空间和其他类型。

1、系统表空间(The System Tablespace)

系统表空间,包含InnoDB数据字典、Doublewrite Buffers、Change Buffers和Undo Logs的存储区域。

默认情况下,系统表空间还包含任何用户在系统表空间中创建的表数据和索引数据。系统表空间是一个共享表空间,因为它由多个表共享。系统表空间可以有一个或多个数据文件。默认情况下,将在数据目录中创建ibdata1文件,默认大小为12M 。

-- 通过 innodb_data_file_path 配置文件的大小和数量。
-- innodb_data_file_path 用来指定innodb tablespace文件
-- 如果我们不在My.cnf文件中指定innodb_data_home_dir和innodb_data_file_path
-- 那么默认会在datadir目录下创建ibdata1 作为innodb tablespace。

-- 默认值:
-- 文件名为ibdata1,autoextend自动扩展
innodb_data_file_path = ibdata1:12M:autoextend

2、独立表空间(File-Per-Table Tablespaces)

独占表空间文件存储在 /data/database1/table1.ibd 文件中,其中仅存储表的相应数据和索引,其余的撤消日志(undo log)、更改缓冲区(change buffer)和双写缓冲区(doublewrite buffer)仍存储在系统表空间中。

如果希望每个表都有一个单独的表空间文件,可以使用innodb_file_per_table。默认情况下从MySQL 5.6开始,启用的(独立的表空间是单个表空间,表是在其自己的数据文件中创建的,而不是在系统表空间中创建的)。如果禁用配置,则将在系统表空间中创建表。

-- 开启独立表空间参数为:innodb_file_per_table

-- 独立表空间:tablename.ibd
-- 新建表被创建于【表空间】中,每一个表建立ibd的扩展文件
-- 文件名为:表名.ibd,该文件默认被创建于数据库目录中,表空间的表文件支持动态和压缩行格式。
innodb_file_per_table = ON
-- 系统表空间:ibdataX,innodb将被创建于【系统表空间】中,即ibdataX中
-- X代表从1开始的一个数字
innodb_file_per_table = OFF

-- 查看表的存储表空间的存储方式值
show variables like 'innodb_file_per_table';

-- 修改存储表空间的存储方式值为OFF
set global innodb_file_per_table=off;

独立表空间和系统表空间的优缺点:

优点: 1、重建或删除表后,独占表空间的磁盘空间可以被回收,而系统表空间优化的磁盘空间只能被后续数据表重用,不能被操作系统回收。2、每个表之间的文件隔离使表文件维度的备份、恢复和压缩更加灵活,而不会影响其他表。

缺点:1、fsync系统调用不友好。如果使用表空间文件,一次系统调用可以完成数据存储,但如果将表空间文件拆分为多个文件。原始的fsync可以对所有涉及的表空间文件执行一次,从而增加fsyncs的数量。2、多个文件将占用更多空间和文件描述符。如果管理不当,很容易浪费空间。例如删除后,系统表空间中的所有表都可以重用标记的空间。如果它是独占表,则只能由同一个表重用。

3、通用表空间(General Tablespaces)

公共表空间是通过 create tablespace 创建表空间语法创建的共享表空间,可以在mysql数据目录之外的其他表空间中创建公共表空间,其作用是可以保存多个表并支持所有行格式。

系统表空间中的所有表共享一个文件,独立表空间中每个表都有一个文件。

优点和缺点都很明显。公共表空间是系统表空间和独立表空间之间的折衷方案。您可以选择指定一些表并将它们存储在公共表空间中。

-- 在/data 目录下创建表空间
CREATE TABLESPACE `ts1` ADD DATAFILE 'ts1.ibd' Engine=InnoDB; 
-- 在指定目录创建表空间
CREATE TABLESPACE `ts1` ADD DATAFILE '/my/tablespace/directory/ts1.ibd' Engine=InnoDB;

-- 将表添加到通用表空间
CREATE TABLE sub_order_info (c1 INT PRIMARY KEY) TABLESPACE ts1; 

4、撤销表空间(Undo Tablespaces)

撤消表空间(Undo Tablespaces)由一个或多个撤消日志文件组成。在MySQL 5.7之前,Undo占用了系统表空间(System Tablespace)共享。从5.7开始,Undo与系统表空间分离。

默认情况下,undo日志存储在系统表空间中,可以配置为存储在一个或多个重做表空间文件,配置 innodb_undo_directory 的 undo 表空间文件的位置。默认值为/data/undo001,

innodb_undo_tablespaces=0:默认值,表示系统表空间ibdata1的使用;大于0表示使用undo表空间undo_001、undo_002等,如果使用的是 SSD 存储,推荐配置 undo 表空间。

5、临时表空间(Temporary Tablespaces)

当MySQL服务器正常关闭或异常终止时,临时表空间将在每次启动时删除并重新创建。

默认情况下,临时表空间数据文件将自动展开,并根据需要自动展开。删除临时表后,可以重用释放的空间,但文件大小保持不变。ibtmp1将在数据库重新启动后重新初始化。您还可以配置以指定最大文件大小。

innodb_temp_data_file_path=ibtmp1:12M:autoextend:max:500M

有两种类型的临时表空间:会话临时表空间(session temporary tablespaces),存储用户创建的临时表和磁盘内的临时表;全局临时表空间(global temporary tablespace)存储用户临时表的回滚段(rollback segments)。

三、表结构文件(数据字典 InnoDB Data Dictionary)

InnoDB数据字典由内部系统表组成,记录了所有表、索引的元数据,由于历史原因这里数据字典元数据,和表的元数据 .frm 文件存在信息重叠。

这些表包含查找表、索引和表字段等对象的元数据。元数据物理上位于InnoDB系统表空间中。

四、双写缓冲区(Doublewrite Buffer)

双写缓冲区(Doublewrite Buffer),位于系统表空间中,是一个存储区域。在将BufferPage页刷新到磁盘上的实际位置之前,数据将存储在Doublewrite缓冲区中。

如果操作系统、存储子系统或mysqld进程在页面写入期间崩溃,InnoDB可以在崩溃恢复期间从Doublewrite缓冲区找到页面备份。在大多数情况下,默认情况下启用双写缓冲区。

-- 禁用Doublewrite 缓冲区
innodb_doublewrite = 0

-- 数据文件写入操作会通知操作系统不要缓存数据,也不要用预读
-- innodb_flush_method控制innodb数据文件及redo log的打开刷写模式
innodb_flush_method = O_DIRECT

五、日志文件(Log)

1、重做日志(Redo Log)

重做日志是一种基于磁盘的数据结构,用于在崩溃恢复期间纠正由不完整事务写入的数据。

MySQL以循环方式写入重做日志文件,将所有更改记录到InnoDB中的缓冲池中。

当发生实例故障且数据无法更新到数据文件时,在重新启动数据库以再次将数据更新到数据时,必须重做数据库。在执行读/写事务期间,会不断生成重做日志。默认情况下,磁盘上的重做日志由两个名为ib_ Logfile0和ib_ logfile1文件的物理表示形式的文件组成。

2、撤销日志(Undo Logs)

Undo 日志是在事务开始之前保存的修改数据的备份。它用于回滚事务。Undo 日志属于逻辑日志,根据每行记录进行记录。Undo 日志存在于系统表空间、撤消表空间和临时表空间中。

3、错误日志(error log)

错误日志(Error Log)是MySQL中最常用的日志。它主要记录MySQL服务器启动和关闭过程中的信息,以及服务器运行过程中的故障和异常。

在MySQL中,默认情况下启用错误日志功能。通常,错误日志存储在MySQL数据库的数据文件夹中,通常命名为hostname err其中,hostname表示MySQL服务器的主机名。

在MySQL配置文件中,可以通过日志错误和日志警告来定义错误日志中记录的信息。日志错误定义是否启用错误日志功能和错误日志的存储位置,日志警告定义是否在错误日志中记录警告信息。

4、二进制日志(bin log)

二进制日志(Binary Log)也可以称为更新日志(Update Log)。它是MySQL中非常重要的日志。它主要用于记录数据库中的更改,即SQL语句的DDL和DML语句,不包括数据记录查询操作。

如果MySQL数据库意外停止,您可以通过二进制日志文件查看用户执行了哪些操作以及对数据库服务器文件进行了哪些修改,然后根据二进制日志文件中的记录恢复数据库服务器。默认情况下,

二进制日志记录处于关闭状态。

5、慢查询日志(Slow Query Log)

慢速查询日志用于记录在MySQL中执行超过指定时间的查询语句。通过缓慢的查询日志,您可以发现哪些查询语句对于优化效率低下。

一般来说,MySQL慢速查询日志是排除SQL语句故障和检查当前MySQL性能的重要功能。如果不需要调整,通常不建议启用此参数,因为启用慢速查询日志或多或少会影响性能。

默认情况下,慢速查询日志功能处于关闭状态。

6、全量日志(general log)

默认情况下,MySQL不会打开 general log,该日志将记录MySQL的所有SQL语句,无论是查询语句、DML语句、DDL语句还是DCL语句。所有这些语句都将记录在 general log 日志文件中。甚至连接和断开MySQL数据库的语句。

MySQL将按照收到的顺序在常规日志中记录它收到的所有SQL语句。我们应该注意,此处接受的SQL语句的顺序并不意味着SQL语句按此顺序执行。有时,某些SQL语句可能只有在释放其他锁后才能执行。SQL语句的执行顺序与binlog中的顺序匹配。

7、中继日志(relay log)

中继日志的内容应用于从属服务器,以便从属服务器和主服务器的数据一致。中继日志在许多方面与二进制日志相似。不同的是,从I/O线程读取主服务器的二进制日志并将其记录到从服务器的本地文件中,然后SQL线程读取中继日志并将它应用到从服务器,从而使从服务器和主服务器的数据一致。

总结

在 InnoDB 存储引擎中,存储结构分为逻辑结构和物理结构,本文详细讲解Innodb的物理结构,包括表空间(独立表空间、共享表空间)、日志文件组(重做文件组)和表结构定义文件组成,及其细节。

同时本文也是对前面文章的一个补充,结合使用效果更佳:《高性能高可用设计实战-索引篇》、《MVCC详解与MVCC实现原理》、《MySQL日志系统以及InnoDB背后的技术》、《Innodb存储引擎逻辑存储结构与底层实现解析》。

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

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

相关文章

云服务器安装jdk

第一步使用工具连接自己的服务器 连接成功后 在左侧选择需要上传的文件到opt目录 在云服务器的命令行操作界面输入指令 解压,输入jdk按table键自动补全 tar -zxvf 配置环境变量 vim /etc/profile 修改环境变量(具体视安装 java 地址修改) …

计算机毕设Python+Vue学生实验报告管理系统(程序+LW+部署)

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

jQuery 介绍

文章目录jQuery 介绍介绍下载安装jQuery 介绍 介绍 jQuery本身就是用JavaScript来写的,它只是把JavaScript中最常用的功能封装起来,以方便开发者快速开发。遥想当年,jQuery的创始人John Resig就是受够了JavaScript的各种缺点,所…

微服务框架 SpringCloud微服务架构 服务异步通讯 51 死信交换机 51.1 初识死信交换机

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 服务异步通讯 文章目录微服务框架服务异步通讯51 死信交换机51.1 初识死信交换机51.1.1 初识死信交换机51.1.2 总结51 死信交换机 51.1 初识…

java 多线程 上

目录 基本概念 线程的创建和使用 Thread类 API中创建线程的两种方式 Thread类的有关方法 线程的调度 线程的优先级 总结 基本概念 程序(program)是为完成特定任务、用某种语言编写的一组指令的集合。即指一段静态的代码,静态对象。 进程(process)是程…

TapTap 算法平台的 Serverless 探索之路

作者:陈欣昊 Serverless 在构建应用上为 TapTap 节省了大量的运维与开发人力,在基本没投入基建人力的情况下,直接把我们非常原始的基建,或者说是资源管理水平拉到了业界相对前沿的标准。最直观的数据是,仅投入了个位数…

代码随想录Day55|392.判断子序列、115.不同的子序列

文章目录392.判断子序列115.不同的子序列392.判断子序列 文章讲解:代码随想录 (programmercarl.com) 题目链接:392. 判断子序列 - 力扣(LeetCode) 题目: 给定字符串 s 和 t ,判断 s 是否为 t 的子序列。…

koa 使用

(贴个官网,koa 内容真不多,非常的小巧轻量) 1. koa 是什么 一个更小、更富有表现力、更健壮的 Web 框架。使用 koa 编写 web 应用,通过组合不同的 generator,可以免除重复繁琐的回调函数嵌套,…

关于新正方教务系统(湖北工程学院)的one day越权漏洞的说明

关于正方教务系统漏洞的说明 此漏洞基于湖北工程学院教务管理系统进行演示,漏洞覆盖新正方教务系统8.0以下版本,为本人一年前提交的漏洞,所以并非0day漏洞 此漏洞影响范围巨大,几乎涉及国内一半高校的教务系统,包含武…

我国油气行业勘探开发投入提升 石油资源存在供需短缺矛盾 天然气需求高速发展

根据观研报告网发布的《2022年中国油气市场分析报告-市场竞争策略与发展动向前瞻》显示,油气是指石油和伴生的天然气,被誉为“能源之王”、“工业的血液”,是全世界各国的战略性产业。油气资源种类多样,根据开采难度可分为两大类&…

Python:三方库安装路径及路径变更

文章目录一、安装三方库的几种方式二、指定第三方库的镜像源三、查看安装默认路径四、修改安装默认路径五、查看安装的库六、导出库安装文件七、安装小结一、安装三方库的几种方式 1.直接pip install安装(有网的环境下通用) : 在python–>…

CSDN上讲得最好的——Linux权限

目录 一、shell原理精讲 二、Linux权限概念 三、权限管理 1、访问者分类 2、文件类型及访问权限 3、表示方法 4、设置方法 (1)chmod (2)chown (3)chgrp (4)umask 四、目录权限 五、粘滞位 一、超级管理员删除 二、该目录的所有者删除 三、…

GDAL之重投影(详细篇)

一、空间坐标系对应EPSG编号 二、通用横向墨卡托(UTM)投影坐标系和WGS84地理坐标系转换 一、目标地区的编号查看(中国东部地区属于UTM Zone 50N) 从180“W开始,有60个纵向投影区,编号为1到60。除了挪威和斯瓦尔巴群岛附近的一些例外,每个区…

【毕业设计_课程设计】基于 U-Net 网络的遥感图像语义分割(源码+论文)

文章目录0 项目说明1 研究目的2 研究方法3 研究结论4 论文目录5 项目工程0 项目说明 **基于 U-Net 网络的遥感图像语义分割 ** 提示:适合用于课程设计或毕业设计,工作量达标,源码开放 实验训练使用 Anaconda 版 Python 3.7 下的 TensorFlo…

OpenSSL BIO源码简析

文章目录1. BIO简介BIO chainBIO数据结构BIO_METHOD数据结构2. Base64示例分析初始化构造BIO链写数据free1. BIO简介 相关文档 /html/man7/bio.html /html/man3/BIO_*.htmlbio - Basic I/O abstraction,即IO抽象层。 BIO有两种: source/sink BIO,即数…

win7系统升级IE11,打补丁KB2729094失败解决办法

因银行这边很多都需要IE11版本,但win7系统大部分需要打一些补丁才能安装。其他补丁都打上了,唯独这个KB2729094一直失败,搞得很无语。还好找到可以直接用命令安装。就不需要打这个补丁了,直接安装使用即可。 1、下载IE11离线安装…

DBCO-PEG-Dopamine,二苯并环辛炔-聚乙二醇-多巴胺,DBCO聚乙二醇衍生物

●中文名:二苯并环辛炔-聚乙二醇-多巴胺,多巴胺聚乙二醇环辛炔 ●英文名:DBCO-PEG-Dopamine,Dopamine-PEG-DBCO ●外观以及性质: DBCO-PEG-Dopamine产物呈固体或粘性液体,取决于PEG分子量,DBCO…

“R语言+遥感”的水环境综合评价方法

目标: 1、掌握R语言基础应用及水环境数据分析方法 2、掌握水环境遥感数据预处理方法 3、掌握水线提取——水体指数与阈值混合法(遥感) 4、掌握水深提取——多元回归分析方法(R语言遥感) 5、掌握水温提取——支持向…

(附源码)springboot学生社团信息管理 毕业设计 011238

目 录 摘要 1 1 绪论 1 1.1 研究背景 1 1.2 研究意义 1 1.3论文结构与章节安排 1 2 学生社团信息管理系统系统分析 3 2.1 可行性分析 3 2.2 系统流程分析 3 2.2.1 数据增加流程 4 2.2.2 数据修改流程 4 2.2.3 数据删除流程 5 2.3 系统功能分析 5 2.3.1 功能性分析 5 2.3.2 非功…

D. Secret Santa(构造)

Problem - 1530D - Codeforces 每年12月,VK都会为其员工举办名为 "秘密圣诞老人 "的传统活动。它是这样发生的。 从1到n的n名员工参加了这个活动。每个员工i被分配到一个不同的员工bi,员工i必须给这个员工做一份新年礼物。每个员工正好被分配…