MySQL 高级 - 第二章 | 数据库目录结构与文件系统

目录

  • 前言
  • 一、数据库主要目录结构
    • 1.1 数据目录路径
    • 1.2 相关命令目录
    • 1.3 配置文件路径
  • 二、数据库和文件系统的关系
    • 2.1 默认数据库
    • 2.2 数据库在文件系统中的表示
    • 2.3 数据表在文件系统中的表示
      • 2.3.1 InnoDB 存储引擎模式
      • 2.3.2 MyISAM 存储引擎模式
    • 2.4 视图在文件系统中的表示
    • 2.5 其他的文件


上篇:第一章、字符集、大小写规范与sql_mode的合理设置
下篇:第三章、用户、权限与角色管理

前言

以下内容以在 linux 上安装的 mysql-8.0 为例,讲述 mysql 的目录结构

本文内容主要源于:bilibili-尚硅谷-MySQL高级篇


一、数据库主要目录结构

1.1 数据目录路径

MySQL 服务器程序在启动时会到文件系统的某个目录下加载一些文件,之后在运行过程中产生的数据也会存储到这个目录下的某些文件中,这个目录称为 数据目录

MySQL数据目录 有一个对应的系统变量 datadir,可以通过以下名称查询 数据目录 的路径:

show variables like 'datadir';

在这里插入图片描述

可以进入到 /var/lib/mysql 目录下,并通过 ll 指令对该目录进行查看:

# 进入 /var/lib/mysql 目录
cd /var/lib/mysql
# 查看目录下的文件
ll

在这里插入图片描述


1.2 相关命令目录

LinuxMySQL 的相关指令主要存放在 /usr/bin/usr/sbin

/usr/bin 下查看 mysql 的相关指令:

# 进入 /usr/bin 目录
cd /usr/bin
# 查看目录下的文件
ls
# 或者 查看目录下与 mysql 相关的文件
find . -name "mysql*"

在这里插入图片描述

/usr/sbin 下查看 mysql 的相关指令:

# 进入 /usr/sbin 目录
cd /usr/sbin
# 查看目录下的文件
ls
# 或者 查看目录下与 mysql 相关的文件
find . -name "mysql*"

在这里插入图片描述


1.3 配置文件路径

LinuxMySQL 的配置文件主要存放在 /usr/share/mysql-8.0

/usr/share/mysql-8.0 下查看 mysql 的配置文件:

# 进入 /usr/share/mysql-8.0 目录
cd /usr/share/mysql-8.0
# 查看目录下的文件
ls

在这里插入图片描述

以及 /etc 下的 my.cnf

# 进入 /etc 目录
cd /etc
# 查看当前目录下名为 my.cnf 的文件
find . -name my.cnf

在这里插入图片描述


二、数据库和文件系统的关系

InnoDBMyISAMM 这样的存储引擎都是把表存储在磁盘上的,操作系统用来管理磁盘的结构被称为 文件系统,所以用专业一点的话来表述就是:像 InnoDBMyISAMM 这样的存储引擎都是把 表存储在文件系统上 的。在读取数据的时候,这些存储引擎会从文件系统中把数据读出来返回;在写入数据的时候,这些存储引擎会把这些数据又写回文件系统。


2.1 默认数据库

在初始化完成之后,会自动创建 4 个默认的数据库

查看所拥有的数据库:

show databases;

示例:

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.00 sec)

各默认数据库的说明:

  • mysql
    • MySQL 系统自带的核心数据库,它存储了 MySQL 的用户账户和权限信息,一些存储过程、事件的定义信息,一些运行过程中产生的日志信息,一些帮助信息以及时区信息等。
  • information_schema
    • MySQL 系统自带的数据库,这个数据库保存着 MySQL 服务器 维护的所有其他数据库的信息,比如有表、视图、 触发器、列、索引等。这些信息并不是真实的用户数据,而是一些描述信息,有时候也成为 元数据
  • performance_schema
    • MySQL 系统自带的数据库,这个数据库主要保存 MySQL 服务器运行过程中的一些状态信息,可以用来 监控 MySQL 服务的各类性能指标。包括统计最近执行了哪些语句,在执行过程的每个阶段都花费了多长事件,内存的使用情况等信息。
  • sys
    • MySQL 系统自带的数据库,这个数据库主要通过 视图 的形式把 information_schemaperformance_schema 结合起来,帮助系统管理员和开发人员监控 MySQL 的技术性能。

2.2 数据库在文件系统中的表示

当使用 CREATE DATABASE database_name 命令创建数据库的时候,在 数据目录 下也会自动创建以 database_name 为名的文件夹

例如:当前 MySQL 中所存在的库

在这里插入图片描述

数据目录 /var/lib/mysql 所存在的文件

在这里插入图片描述

创建一个名为 mike_test 的数据库:

CREATE DATABASE mike_test;

在这里插入图片描述

在数据目录 /var/lib/mysql 下就会有一个名为 mike_test 的文件夹被创建出来

在这里插入图片描述

如果数据库是 mysql-5.7 及之前的版本,在所创建库同名的文件夹 mike_test 下,还会创建一个 db.opt 的文件,该文件主要是用于记录当前数据库的字符集与比较规则:
示例:

[root@iZwz99hndp44mfccvavnzmZ mysql]# cd mike_test
[root@iZwz99hndp44mfccvavnzmZ mike_test]# ls
db.opt

mysql-8.0 创建库的时候并不会生产 db.opt 文件


2.3 数据表在文件系统中的表示

表中的数据都是以 记录的形式 插入到表中的,每个表的信息可以分为两种:

  • ① 表结构的定义
  • ② 表中的数据

表结构 就是该表的名称,表里边有多少列,每个列的数据类型,约束条件和索引,使用的字符集和比较规则等各种信息,这些信息都体现在建表语句中。


2.3.1 InnoDB 存储引擎模式

之前我创建了一个 mike_test 的数据库,接下来在该数据库中创建一张 test_table_01 的表,用的是 InnoDB 的存储引擎

CREATE TABLE `test_table_01`
(`id`   int(11) NOT NULL AUTO_INCREMENT COMMENT 'id',`name` varchar(64) DEFAULT NULL COMMENT '名称',PRIMARY KEY (`id`)
) ENGINE = InnoDBAUTO_INCREMENT = 1DEFAULT CHARSET = utf8mb4 COMMENT ='测试表01';

在这里插入图片描述

这里主要分为两种情况去考虑,一个是 mysql-5.7,另一个是 mysql-8.0

情况一:mysql 版本为 5.7

储备知识:

  • InnoDB 其实是使用页为基本单位来管理存储空间的,默认的页大小为 16KB
  • 对于 InnoDB 存储引擎来说,每个索引都对应着一棵 B+ 树,该 B+ 树的每个节点都是一个数据页,数据页之间不必要是物理连续的,因为数据页之间有双向链表来维护着这些页的顺序
  • InnoDB 的聚簇索引的叶子节点存储了完整的用户记录,也就是所谓的索引即数据,数据即索引

为了更好的管理这些页,InnoDB 提出了一个 表空间 或者 文件空间(英文名:table space 或者 file space)的概念,这个表空间是一个抽象的概念,它可以对应文件系统上一个或者多个真实文件(不同表空间对应的文件数量可能不同)。每一个 表空间 可以被划分为很多个 ,表数据就存放在某个表空间下的某些页里,这里的表空间有不同的类型

  • ① 系统表空间(system table space)
    默认情况下,InnoDB 会在数据目录下创建一个名为 ibdata1、大小为 12MB 的文件,这个文件就是对应的系统表空间在文件系统上的表示,该文件是自扩展文件,当不够用的时候它会自己增加文件大小。当然,如果你想让系统表空间对应系统上多个实际文件,或者不想用 ibdata1。可以修改一下 my.cnf 配置文件,使 MySQL 启动时配置对应的文件路径以及它们的大小,比如:

    [server]
    innodb_data_file_path=data1:512M;data2:512M;autoextend

    这样在 MySQL 启动之后就会创建这两个 512MB 大小的文件作为系统表空间,其中的 autoextend 表明这两个文件如果不够用会自动扩展 data2 文件的大小,需要注意的一点是,在 一个 MySQL 服务器中,系统表空间只有一种,从 mysql-5.5.7mysql-5.6.6 之间的各个版本中,表中的数据都会被默认存储到这个系统表空间
  • ② 独立表空间(file-per-table table space)
    mysql-5.6.6 以及之后的版本中,InnoDB 并不会默认的把各个表的数据存储到系统表空间中,而是为每一个表建立一个独立表空间,也就是说创建了多少个表,就有多少个独立表空间,使用独立表空间来存储数据表的话,会在该表所属数据库对应的子目录下创建一个表示该独立表空间的文件,文件名和表名相同,只不过添加了一个 .ibd

如果使用的是 5.7 版本的 mysql 创建表,在该数控库同名的文件夹 mike_test 下,会生成 .frm.ibd 两个文件(db.opt 文件在创建数据库时就会生成)

示例:

[root@iZwz99hndp44mfccvavnzmZ mysql]# cd mike_test
[root@iZwz99hndp44mfccvavnzmZ mike_test]# ls
db.opt
test_table_01.frm
test_table_01.ibd

表名.frm描述表结构的文件.frm 文件的格式在不同的平台上都是相同的,以 二进制 存储

表名.ibd 是一个 独立表空间,用于存放表的数据和索引

可以自己指定使用 系统表空间 还是 独立表空间 来存储数据,这个功能由启动参数 innodb_file_per_table 控制

在这里插入图片描述

如果需要将数据存储到 系统表空间 时,可以在启动 MySQL 服务器的时候配置:

[server]
#0:代表使用系统表空间,1:代表使用独立表空间
innodb_file_per_table=0 

innodb_file_per_table 参数的修改只对新建的表起作用,对于以及分配了表空间的数据表则不起作用,如果我们想把已经存在系统表空间中的表转移到独立表空间,可以使用下边的语法:

ALTER TABLE 表名 TABLESPACE [=] innodb_file_per_table;

情况二:mysql 版本为 8.0

如果使用的是 8.0 版本的 mysql 创建表,在该数控库同名的文件夹 mike_test 下,只会生成 .ibd 一个文件

示例:

[root@iZwz99hndp44mfccvavnzmZ mysql]# cd mike_test
[root@iZwz99hndp44mfccvavnzmZ mike_test]# ls
test_table_01.ibd

对比 mysql-5.7 所创建的表可以发现少了用于记录当前数据库的字符集与比较规则 db.opt 和描述表结构的文件 表名.frm,只有一个独立表空间 表名.ibd

Oracle 官方将 frm 文件的信息移动到序列化字典信息 (Serialized Dictionary information, SDI),SDI 就是表和表空间对象的序列化元数据,在 mysql-8.0SDI 被写在 .ibd 文件内部

也就是说在 mysql-8.0 的时候,就把表的字符集、比较规则、表结构信息都存到了 .ibd 文件中

Oracle 提供了一个应用程序 ibd2sdi可以从 .ibd 文件中提取 SDI 信息

查看表结构:

ibd2sdi --dump-file=table_name.txt table_name.ibd

在这里插入图片描述

打开该文件就能查看到表结构的详细信息

在这里插入图片描述


2.3.2 MyISAM 存储引擎模式

之前在 mike_test 的数据库下创建一张 test_table_01 的表,用的是 InnoDB 的存储引擎,现在创建一张 test_table_02 的表,用的是 MyIASM 的存储引擎

CREATE TABLE `test_table_02`
(`id`   int(11) NOT NULL AUTO_INCREMENT COMMENT 'id',`name` varchar(64) DEFAULT NULL COMMENT '名称',PRIMARY KEY (`id`)
) ENGINE = MYISAMAUTO_INCREMENT = 1DEFAULT CHARSET = utf8mb4 COMMENT ='测试表02';

在这里插入图片描述

这里也分为两种情况去考虑,一个是 mysql-5.7,另一个是 mysql-8.0

情况一:mysql 版本为 5.7

如果使用的是 5.7 版本的 mysql 创建表,在该数控库同名的文件夹 mike_test 下,会生成 .frm 以及 .MYD.MYI 三个文件

示例:

[root@iZwz99hndp44mfccvavnzmZ mysql]# cd mike_test
[root@iZwz99hndp44mfccvavnzmZ mike_test]# ls
db.opt
test_table_01.frm
test_table_01.ibd
test_table_02.frm
test_table_02.MYD
test_table_02.MYI

表名.frm描述表结构的文件

表名.MYD存储表数据的文件,采用独立表存储模式

表名.MYI存储表索引的文件,为该表创建的索引都会存放在该文件之中

在存储表结构上,MyISAMInnoDB 一样,也是在 数据目录 下对应的数据库子目录下创建了一个专门用于描述表结构的 .frm 文件

由于 MyISAM 的索引都是 二级索引,该存储引擎的 数据索引 是分开的,所以在文件系统中也是使用不同的文件来存储数据和索引

情况二:mysql 版本为 8.0

如果使用的是 5.7 版本的 mysql 创建表,在该数控库同名的文件夹 mike_test 下,会生成 .sdi 以及 .MYD.MYI 三个文件

示例:

[root@iZwz99hndp44mfccvavnzmZ mysql]# cd mike_test
[root@iZwz99hndp44mfccvavnzmZ mike_test]# ls
test_table_01.ibd
test_table_02_422.sdi
test_table_02.MYD
test_table_02.MYI

对比 mysql-5.7 所创建的表可以发现 .frm.sdi 取代了,.MYD.MYI 都存在

SDI 就是表和表空间对象的序列化元数据,相对于 InnoDBSDI 写入 .ibd 中,MyISAM 则是写在了 .sdi 文件中


2.4 视图在文件系统中的表示

MySQL视图 其实是 虚拟的表,也就是某个查询语句的一个别名而已,所以在存储视图的时候是不需要存储真实的数据的,只要把它的结构存储起来就行了,和表一样,描述视图结构的文件也会被存储到所属数据库对应的子目录下

比如我创建一个视图:

# 创建一个视图
CREATE VIEW view_test_table_01 AS
SELECT id, name
FROM test_table_01;

在这里插入图片描述

如果 mysql 用的是 5.7 版本,在数据库同名的文件夹下就会存储一个 视图名.frm 的文件

示例:

[root@iZwz99hndp44mfccvavnzmZ mysql]# cd mike_test
[root@iZwz99hndp44mfccvavnzmZ mike_test]# ls
db.opt
test_table_01.frm
test_table_01.ibd
test_table_02.frm
test_table_02.MYD
test_table_02.MYI
view_test_table_01.frm

如果 mysql 用的是 8.0 版本,创建视图并不会在数据库同名的文件夹下创建文件


2.5 其他的文件

除了上述用于用户存储的数据文件外,数据目录 下还包括为了更好运行程序的一些额外文件,主要包括以下几类:

  • 服务器进程文件
    • 每一个运行的 MySQL 服务程序都相当于一个进程,MySQL 服务器会把自己的进程 ID 写入到一个文件中
  • 服务器日志文件
    • 在服务器运行过程中,会产生各种各样的日志,比如:常规的查询日志、错误日志、二进制日志、redo 日志等
  • 默认/自动生成的 SSL 和 RSA 证书和密钥文件
    • 主要是为了客户端和服务端安全通信而创建的一些文件

上篇:第一章、字符集、大小写规范与sql_mode的合理设置
下篇:第三章、用户、权限与角色管理

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

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

相关文章

基于FPGA的多路彩灯控制器VHDL代码Quartus仿真

名称:基于FPGA的多路彩灯控制器VHDL代码Quartus仿真(文末获取) 软件:Quartus 语言:VHDL 代码功能: 多路彩灯控制器 综合训练内容要求 设计一台基于FPGA的多路彩灯控制器的设计。要求如下 1.彩灯从左…

怎样扫描二维码后看图片?图片二维码的制作方式

二维码是一种可以用来存储大量内容,通过扫描二维码的方式来向其他人提供内容,比较常见的展示内容有视频、图片、文件、文本、音频等。那么图片生成二维码的方法是什么样的呢?通过扫码查看图片,可以不下载的图片的同时快速预览内容…

工控人机交互界面编辑软件附描述(电脑软件分享)

HMI 概述:本文为分享型文档 本文摘要 昆仑通泰触摸屏软件分享。   给触摸屏下载程序时使用。   本人用过案例西门子s7-1200/200smart ST30与触摸屏型号“TPC1061Ti”通讯。 文章目录 本文摘要1.MCGS组态环境嵌入式版,大部分人用过此款,容…

JavaScript余数运算符

console.log(5 % 2); //5 2 * 2 1 console.log(8 % 3); //8 2 * 3 2 console.log(6 % 2); //6 2 * 3 0 console.log(7 % 2); //7 2 * 3 1● 我们可以利用这个特性来判断一个数是奇数还是偶数 const isEven n >n % 2 0 ? console.log(${n}是偶数) : console.…

麦肯锡精英高效阅读法笔记

系列文章目录 如何有效阅读一本书笔记 读懂一本书笔记 麦肯锡精英高效阅读法笔记 文章目录 系列文章目录序章 无法读书的5个理由无法读书的理由① 忙于工作,没时间读书无法读书的理由② 不知应该读什么无法读书的理由③ 没读完的书不断增多无法读书的理由④ 工作繁…

在2-3-4树上实现连接与分裂操作的算法与实现

在2-3-4树上实现连接与分裂操作的算法与实现 引言1. 维护2-3-4树结点的高度属性伪代码示例 2. 实现连接操作伪代码示例 3. 证明简单路径p的划分性质4. 实现分裂操作伪代码示例 C代码示例结论 引言 2-3-4树是一种平衡搜索树,它保证了树的高度被有效控制,…

GhostNetV2 Enhance Cheap Operation with Long-Range Attention 论文学习

论文地址:https://arxiv.org/abs/2211.12905 代码地址:https://github.com/huawei-noah/Efficient-AI-Backbones/tree/master/ghostnetv2_pytorch 解决了什么问题? 在计算机视觉领域,深度神经网络在诸多任务上扮演着重要角色。为…

机器学习实践:超市商品购买关联规则分析

第2关:动手实现Apriori算法 任务描述 本关任务:编写 Python 代码实现 Apriori 算法。 相关知识 为了完成本关任务,你需要掌握 Apriori 算法流程。 Apriori 算法流程 Apriori 算法的两个输人参数分别是最小支持度和数据集。该算法首先会生成所…

【最大公约数 并集查找 调和级数】1998. 数组的最大公因数排序

本文涉及知识点 最大公约数 并集查找 调和级数 LeetCode1998. 数组的最大公因数排序 给你一个整数数组 nums ,你可以在 nums 上执行下述操作 任意次 : 如果 gcd(nums[i], nums[j]) > 1 ,交换 nums[i] 和 nums[j] 的位置。其中 gcd(nums…

面试经验分享 | 蓝队面试经验

关于蓝队面试经验 1.自我介绍能力 重要性 为什么将自我介绍能力放在第一位,实际上自我介绍才是面试中最重要的一点,因为护网面试并没有确定的题目,让面试官去提问 更多是的和面试官的一种 “交谈” ,面试的难易程度也自然就取决…

三维点云处理-模型拟合

以直线拟合为例,模型拟合常用的方法有Least Square(最小二乘)、Hough Transform(霍夫变换)、Random Sample Consensus(RANSAC)等。那么该如何区分和使用这几种方法呢? 情况1&#x…

基于springboot实现夕阳红公寓管理系统项目【项目源码+论文说明】

基于springboot实现夕阳红公寓管理系统演示 摘要 如今社会上各行各业,都在用属于自己专用的软件来进行工作,互联网发展到这个时候,人们已经发现离不开了互联网。互联网的发展,离不开一些新的技术,而新技术的产生往往是…

深入理解Java虚拟机(JVM)

引言: Java虚拟机(JVM)是Java平台的核心组件,它负责将Java字节码转换成平台特定的机器指令,并在相应的硬件和操作系统上执行。JVM的引入使得Java语言具有“一次编写,到处运行”的跨平台特性。本文将深入探…

W801学习笔记二十一:英语背单词学习应用——上

英语背单词是比较常见的学习APP,参考唐诗宋词应用,本章做一个类似的应用。 一、单词数据清洗及格式转换 诗词数据的获取渠道很多,一般可以按照年级来分文件。如一到九年级,四六级,雅思等等。 1、先从网上某某地方下载…

【计算机科学速成课】笔记一

文章目录 写在前面1.计算机的早期历史2.电子计算机3.布尔运算和逻辑门4.二进制5.算术逻辑单元-ALU6.寄存器和内存 写在前面 所有的一切源于这样一个网站——CS自学指南。 这是新手小白入门计算机科学必要了解的知识——【计算机科学速成课】[40集全/精校] - Crash Course Comp…

HTML_CSS学习:尚硅谷——尚品汇

一、index.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>荣耀</title> <!-- 引入页签图标--><link rel"shortcut icon" href"./HONOR%20.ico" type&qu…

navicat premium16.3.9重置

软件下载 官网地址&#xff1a;https://navicat.com.cn/products/ # 准备脚本 1、建一个txt 2、复制以下代码 3、修改文件格式为bat 4、运行bat文件 5、重新打开navicat&#xff0c;试用期重置为14 经测试16.2.3以上版本均可用 echo off set dnInfo set dn2ShellFolder set r…

展开说说:Android线程池解析

何谓线程池&#xff1f;本人理解是存放和管理线程的一个容器。 线程池存在的意义是什么&#xff1f; 第一&#xff1a;前面博客提到过创建和销毁线程的操作本身是有性能开销的&#xff0c;如果把使用的线程对象存起来下次用的时候直接取出来用就省去了一次创建和销毁的成本&a…

0基础学PHP有多难?

php作为web端最佳的开发语言&#xff0c;没有华而不实&#xff0c;而是经受住了时间考验&#xff0c;是一门非常值得学习的编程语言。 目前市场上各种网站、管理系统、小程序、APP等&#xff0c;基本都是使用PHP开发的&#xff0c;也侧面反映了PHP的需求以及学习的必要性&…

程序员的神器指南!揭秘软件开发必备工具

在软件开发的广袤海洋中&#xff0c;程序员们像是驾驶着帆船探索未知的航海者。他们面对的不仅仅是代码的挑战&#xff0c;还有项目管理、协作沟通和时间限制的压力。为了应对这些挑战&#xff0c;程序员们需要一系列强大的工具&#xff0c;就像是海中的指南针&#xff0c;帮助…