第8章 MySQL的数据目录

news2024/11/25 2:25:20

8.1 数据库和文件系统的关系

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

8.2 MySQL数据目录

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

8.2.1 数据目录和安装目录的区别

我们之前只接触过 MySQL 的安装目录(在安装 MySQL 的时候我们可以自己指定),我们重点强调过这个 安装目录 下非常重要的 bin 目录,它里边存储了许多关于控制客户端程序和服务器程序的命令(许多可执行文件,比如 mysql , mysqld , mysqld_safe 等等好几十个)。而 数据目录 是用来存储 MySQL 在运行过程中产生的数据,一定要和本章要讨论的 安装目录 区别开。

8.2.2 如何确定MySQL中的数据目录

MySQL 把数据都存到哪个路径下呢?其实 数据目录 对应着一个系统变量 datadir ,我们在使用客户端与服务器建立连接之后查看这个系统变量的值就可以了:

8.3 数据目录的结构

MySQL 在运行过程中都会产生哪些数据呢?当然会包含我们创建的数据库、表、视图和触发器的用户数据,除了这些用户数据,为了程序更好的运行, MySQL 也会创建一些其他的额外数据。

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

每当我们使用 CREATE DATABASE 数据库名 语句创建一个数据库的时候,在文件系统上实际发生了什么呢?其实很简单,每个数据库都对应数据目录下的一个子目录,或者说对应一个文件夹,我们每当我们新建一个数据库时, MySQL 会帮我们做这两件事儿:

  1. 在数据目录 下创建一个和数据库名同名的子目录(或者说是文件夹)。
  2. 在该与数据库名同名的子目录下创建一个名为 db.opt 的文件,这个文件中包含了该数据库的各种属性,比方说该数据库的字符集和比较规则是个啥。

比方说我们查看一下在我的计算机上当前有哪些数据库:

                                                  

当然这个数据目录下的文件和子目录比较多哈,但是如果仔细看的话,除了 information_schema 这个系统数据库外,其他的数据库在 数据目录 下都有对应的子目录。这个 information_schema 比较特殊,设计MySQL的大叔们对它的实现进行了特殊对待,没有使用相应的数据库目录,我们忽略它的存在就好了哈。

8.3.2 表在文件系统中的表示

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

1. 表结构的定义

2. 表中的数据

表结构 就是该表的名称是啥,表里边有多少列,每个列的数据类型是啥,有啥约束条件和索引,用的是啥字符集和比较规则吧啦吧啦的各种信息,这些信息都体现在了我们的建表语句中了。为了保存这些信息, InnoDB 和MyISAM 这两种存储引擎都在 数据目录 下对应的数据库子目录下创建了一个专门用于描述表结构的文件,文件名是这样:

表名.frm

比方说我们在lsx数据库下创建一个名为 test 的表:

描述表结构的文件我们知道怎么存储了,那表中的数据存到什么文件中了呢?在这个问题上,不同的存储引擎就产生了分歧了,下边我们分别看一下 InnoDB 和 MyISAM 是用什么文件来保存表中数据的。

8.3.2.1 InnoDB是如何存储表数据的

InnoDB的一些实现原理:

InnoDB 其实是使用 页 为基本单位来管理存储空间的,默认的 页 大小为 16KB 。

对于 InnoDB 存储引擎来说,每个索引都对应着一棵 B+ 树,该 B+ 树的每个节点都是一个数据页,数据页之间不必要是物理连续的,因为数据页之间有 双向链表 来维护着这些页的顺序。

InnoDB 的聚簇索引的叶子节点存储了完整的用户记录,也就是所谓的索引即数据,数据即索引。

系统表空间(system tablespace)

这个所谓的 系统表空间 可以对应文件系统上一个或多个实际的文件,默认情况下, InnoDB 会在 数据目录 下创建一个名为 ibdata1 (在你的数据目录下找找看有木有)、大小为 12M 的文件,这个文件就是对应的 系统表空间 在文件系统上的表示。怎么才 12M ?这么点儿还没插多少数据就用完了,那是因为这个文件是所谓的自扩展文件 ,也就是当不够用的时候它会自己增加文件大小。

当然,如果你想让系统表空间对应文件系统上多个实际文件,或者仅仅觉得原来的 ibdata1 这个文件名难听,那可以在 MySQL 启动时配置对应的文件路径以及它们的大小,比如我们这样修改一下配置文件:

这样在 MySQL 启动之后就会创建这两个512M大小的文件作为 系统表空间 ,其中的 autoextend 表明这两个文件如果不够用会自动扩展 data2 文件的大小。

我们也可以把 系统表空间 对应的文件路径不配置到 数据目录 下,甚至可以配置到单独的磁盘分区上,涉及到的启动参数就是 innodb_data_file_path 和 innodb_data_home_dir。需要注意的一点是,在一个MySQL服务器中,系统表空间只有一份。从MySQL5.5.7到MySQL5.6.6之间的各个版本中,我们表中的数据都会被默认存储到这个 系统表空间。

独立表空间(file-per-table tablespace)

在MySQL5.6.6以及之后的版本中, InnoDB 并不会默认的把各个表的数据存储到系统表空间中,而是为每一个表建立一个独立表空间,也就是说我们创建了多少个表,就有多少个独立表空间。使用 独立表空间 来存储表数据的话,会在该表所属数据库对应的子目录下创建一个表示该 独立表空间 的文件,文件名和表名相同,只不过添加了一个 .ibd 的扩展名而已,所以完整的文件名称长这样:

表名.ibd

比方说假如我们使用了 独立表空间 去存储lsx数据库下的 test 表的话,那么在该表所在数据库对应的lsx目录下会为 test 表创建这两个文件:

test.frm

test.ibd

其中 test.ibd 文件就用来存储 test 表中的数据和索引。当然我们也可以自己指定使用 系统表空间 还是 独立表空间 来存储数据,这个功能由启动参数 innodb_file_per_table 控制,比如说我们想刻意将表数据都存储到系统表空间 时,可以在启动 MySQL 服务器的时候这样配置:

[server]innodb_file_per_table=0

当 innodb_file_per_table 的值为 0 时,代表使用系统表空间;当 innodb_file_per_table 的值为 1 时,代表使用独立表空间。不过 innodb_file_per_table 参数只对新建的表起作用,对于已经分配了表空间的表并不起作用。如果我们想把已经存在系统表空间中的表转移到独立表空间,可以使用下边的语法:

ALTER TABLE 表名 TABLESPACE [=] innodb_file_per_table;

或者把已经存在独立表空间的表转移到系统表空间,可以使用下边的语法:

ALTER TABLE 表名 TABLESPACE [=] innodb_system;

其中中括号扩起来的 = 可有可无,比方说我们想把 test 表从独立表空间移动到系统表空间,可以这么写:

ALTER TABLE test TABLESPACE innodb_system;

8.3.2.2 MyISAM是如何存储表数据的

在 MyISAM 中的索引全部都是 二级索引 ,该存储引擎的数据和索引是分开存放的。所以在文件系统中也是使用不同的文件来存储数据文件和索引文件。而且和 InnoDB 不同的是, MyISAM 并没有什么所谓的 表空间 一说,表数据都存放到对应的数据库子目录下。假如 test 表使用 MyISAM 存储引擎的话,那么在它所在数据库对应的 xiaohaizi 目录下会为 test 表创建这三个文件:

test.frm

test.MYD

test.MYI

其中 test.MYD 代表表的数据文件,也就是我们插入的用户记录; test.MYI 代表表的索引文件,我们为该表创建的索引都会放到这个文件中。

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

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

8.3.4 其他的文件

除了我们上边说的这些用户自己存储的数据以外, 数据目录 下还包括为了更好运行程序的一些额外文件,主要包括这几种类型的文件:

服务器进程文件。

我们知道每运行一个 MySQL 服务器程序,都意味着启动一个进程。 MySQL 服务器会把自己的进程ID写入到一个文件中。

服务器日志文件。

在服务器运行过程中,会产生各种各样的日志,比如常规的查询日志、错误日志、二进制日志、redo日志吧啦吧啦各种日志,这些日志各有各的用途,我们之后会重点唠叨各种日志的用途,现在先了解一下就可以了。

默认/自动生成的SSL和RSA证书和密钥文件。

主要是为了客户端和服务器安全通信而创建的一些文件。

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

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

相关文章

API接口采集电商平台阿里巴巴中国站获得1688商品评论数据货品评分、评价内容接口调用指南

淘宝API商品评论接口,主要用于获取某个商品的评价信息。通过该接口,我们可以获取到商品的所有评价内容、评价时间、评价等级等相关信息,帮助我们更好地了解用户对商品的反馈,进而进行数据分析和业务优化。 1688.item_review-获得…

投票制作创建流量主小程序开发

很多企业、团队、门店商家有创建投票活动的需求,单独开发一套成本过高,所以会找一些市面上可以创建投票活动的工具。基于此开发了一款可以创建制作投票活动的小程序。 小程序主要是投票活动的制作、创建,可以接入流量主广告和会员功能&#…

成集云 | 金蝶K3集成聚水潭ERP(金蝶K3主管库存)| 解决方案

源系统成集云目标系统 方案介绍 金蝶K3是一款ERP软件,它集成了供应链管理、财务管理、人力资源管理、客户关系管理、办公自动化、商业分析、移动商务、集成接口及行业插件等业务管理组件。以成本管理为目标,计划与流程控制为主线,通过对成本…

温度传感器的精度受什么影响

温度传感器(temperature transducer)是指能感受温度并转换成可用输出信号的传感器。是早开发,应用极其广的一类传感器,是温度测量仪表的核心部分。现代的温度传感器外形非常得小,这样更加让它广泛应用在生产实践的各个…

PowerDesigner 与 mysql 同步数据

PowerDesigner 连接上数据库 创建数据库表 table_5 选择: 点击确认后弹出 点击run执行 刷新数据库表,已创建成功 修改测试表1,新增一个字段 取消全选 选择数据库,勾选修改的表,如果全部勾选的话,就…

3D动画制作和渲染需要什么样的硬件规格?

动画是艺术与技术的令人兴奋的融合,为无限的创造力提供了广阔的画布。为了将创意愿景变为现实,动画师需要适合其工艺的强大计算资源。每个动画项目都有不同的硬件需求,无论是制作简单的 2D 动画还是构建复杂的 3D 世界。因此,有抱…

字符串 (3)--- KMP 算法的扩展

对于个长度为n的字符串s。定义函数z[i]表示s和s[i,n-1](即以 s[i] 开头的后缀)的最长公共前缀(LCP)的长度。 z被称为s的Z函数。特别地,z[0] 0。 如同大多数字符串主题所介绍的算法,其关键在于&#xff0c…

深度学习之模型压缩、加速模型推理

简介 当将一个机器学习模型部署到生产环境中时,通常需要满足一些在模型原型阶段没有考虑到的要求。例如,在生产中使用的模型将不得不处理来自不同用户的大量请求。因此,您将希望进行优化,以获得较低的延迟和/或吞吐量。 延迟&…

MyBatis-Plus 使用拦截器实现数据权限控制

平时开发中遇到根据当前用户的角色,只能查看数据权限范围的数据需求。列表实现方案有两种,一是在开发初期就做好判断赛选,但如果这个需求是中途加的,或不希望每个接口都加一遍,就可以方案二加拦截器的方式。在mybatis执…

BIT-4-数组

一维数组的创建和初始化一维数组的使用 一维数组在内存中的存储 二维数组的创建和初始化二维数组的使用二维数组在内存中的存储 数组越界数组作为函数参数数组的应用实例1:三子棋 数组的应用实例2:扫雷游戏 1. 一维数组的创建和初始化 1.1 数组的创建 …

IOS17正式版今日发布

北京时间9月19日凌晨,苹果公司正式向全球用户推送了期待已久的iOS 17正式版。此次更新为iPhone带来了多项激动人心的功能,包括对“电话”、“信息”、FaceTime通话的重大更新,“待机显示”以及音乐、小组件、Safari浏览器的升级等。 据了解&…

二叉树顺序结构及实现

👉二叉树顺序结构及实现 1.二叉树的顺序结构2.堆的概念及结构3.堆的实现3.1堆向下调整算法3.2堆向上调整算法 4.堆的创建4.1堆创建方法14.1.1构建堆结构体4.1.2堆的初始化4.1.3堆数据添加向上调整4.1.4主函数内容 4.2堆的创建方法24.2.1堆数据添加向下调整 4.3堆数据…

DevicData-D-XXXXXXXX勒索病毒数据怎么处理|数据解密恢复

引言: 在当今数字化时代,勒索病毒已成为网络威胁的一部分,其中DevicData-D-XXXXXXXX勒索病毒是其中一种。本文将深入解析DevicData-D-XXXXXXXX勒索病毒的工作原理,并提供有效的对策方法。如果您正在经历数据恢复的困境&#xff0…

腾讯云OCR - 降低客服财务运营成本

说明:参与中秋活动 一、 前言: 随着图片时代的飞速发展,大量的文字内容为了优化排版和表现效果,都采用了图片的形式发布和存储,这为内容的传播和安全性带来了很大的便利,需要做重复性劳动。 OCR文字扫描工…

服务器数据恢复-UNIX类文件系统软件层级故障的数据恢复可能性分析

服务器数据恢复环境: 基于UNIX系统,软件层级的数据灾难。 服务器故障: 1、存储结构出错。 2、删除数据。 3、文件系统格式化。 4、其他原因导致的数据丢失。 服务器数据恢复的可能性分析: 1、存储结构出错。 无论错误出现在RAID还…

将el-table数据导出csv各式,纯前端实现

tableData数据:tableData: [{ column1: 值1-1, column2: 值1-2 },{ column1: 值2-1, column2: 值2-2 },{ column1: 值3-1, column2: 值3-2 }], exportToCSV() {// 将表格数据转化为CSV格式const csvContent this.convertArrayOfObjectsToCSV(this.tableData);// 创…

关于 firefox 不能访问 http 的解决

情景: 我在虚拟机 192.168.x.111 上配置了 DNS 服务器,在 kali 上设置 192.168.x.111 为 DNS 服务器后,使用 firefox 地址栏搜索域名 www.xxx.com ,访问在 192.168.x.111 搭建的网站,本来经 192.168.x.111 DNS 服务器解…

无涯教程-JavaScript - ROUNDDOWN函数

描述 ROUNDOWN函数将数字向下舍入为零。 ROUNDDOWN是Excel舍入函数之一。 语法 ROUNDDOWN (number, num_digits)争论 Argument描述Required/OptionalNumberAny real number that you want rounded down.RequiredNum_digitsThe number of digits to which you want to round…

Linux Static Key原理与应用

文章目录 背景1. static-key的使用方法1.1. static-key定义1.2 初始化1.3 条件判断1.4 修改判断条件 2、示例代码参考链接 背景 内核中有很多判断条件在正常情况下的结果都是固定的,除非极其罕见的场景才会改变,通常单个的这种判断的代价很低可以忽略&a…

msvcp71.dll丢失的解决方法分享,全面分析msvcp71.dll丢失原因

msvcp71.dll 丢失的问题可能困扰着许多使用 Windows 操作系统的用户。msvcp71.dll 是微软 C运行时库中的一个动态链接库文件,负责提供一些基本的函数和类,例如字符串处理、数学运算、文件操作等。如果这个文件丢失或损坏了,那么在使用依赖于它…