Mysql文件存储图文详解


Posted in MySQL onJune 01, 2021

什么是文件系统

我们知道像 InnoDB、MyIASM 这样的存储引擎都是把表存储在磁盘上的(持久化)。当我们想读取数据的时候,这些存储引擎会从文件系统中把数据读出来返回给我们, 当我们想写入数据的时候,这些存储引擎会把这些数据又写回文件系统。

当然,MySQL除了存储实际的数据,还存储了一系列其他的日志,在这些也属于文件系统。

存储引擎的落盘文件地址

使用客户端与服务器建立连接之后查看这个系统变量的值就可以了:

show variables like 'datadir';

Mysql文件存储图文详解

当然这个目录可以通过配置文件进行修改,由我们自己进行指定。

磁盘文件中的内容都是些什么

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

数据库Date目录下的表信息

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

  • 在数据目录下创建一个和数据库名同名的子目录(或者说是文件夹)。
  • 在该与数据库名同名的子目录下创建一个名为 db.opt 的文件,这个文件 中包含了该数据库的各种属性,比方说该数据库的字符集和比较规则是个啥。 比方说我们查看一下在我的计算机上当前有哪些数据库?

Mysql文件存储图文详解

可以看到在当前有 5 个数据库,其中 mysqladv 数据库是我们自定义的,其余 4 个数据库是属于 MySQL 自带的系统数据库。我们再看一下数据目录下的内容:

Mysql文件存储图文详解

当然这个数据目录下的文件和子目录比较多,但是如果仔细看的话,除了 information_schema 这个系统数据库外,其他的数据库在数居目录下都有对应的 子目录。这个 information_schema 比较特殊,我们后面再讲它的作用。

InnoDB是如何存储数据的

我们的InnoDB在添加一个数据库,就会在日志根目录中添加一个文件夹。

Mysql文件存储图文详解

每一个文件夹中又存储对应的所有表数据。每一个表的数据一般根据以下两种规则进行划分:

表结构的定义

我们以自己建立的study库中的index_condition_pushdown表为例:

Mysql文件存储图文详解

Mysql文件存储图文详解

表结构就是这些数据,对应存储的文件名为:

Mysql文件存储图文详解

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

表中的数据

表所属数据库对应的子目录下创建一个表示该独立表空间的文件,文件名和表名相同,只不过添加了一个.ibd 的扩展名而已,所以完整的文件名称长这样:表名.ibd。

Mysql文件存储图文详解

MyISAM是如何存储表数据的

在 MyISAM 中的数据和索引是分开存放的。所以在文件系统中也是使用不同的文件来存储数据文件和索引文件。(相比于InnoDB中,ibd文件存储了数据+索引,MyISAM再次进行了拆分)。

Mysql文件存储图文详解

如图,我们更换存储引擎。

Mysql文件存储图文详解

文件目录更换为了上图。可以简单理解为将InnoDB的.ibd文件进行了拆分,变为了以下两个文件》

.MYD 代表表的数据文件。

.MYI 代表表的索引文件。

这里,也就总结除了InnoDB和MyISAM的一个重要区别。就是InnoDB的索引和数据都在一个文件夹中,而MyISAM则是将数据文件和索引文件分开存放在两个文件中的。

日志文件

在服务器运行过程中,会产生各种各样的日志,比如常规的查询日志、错误日志、binlog日志、redo 日志、Undo 日志等等,日志文件记录了影响 MySQL 数据库的各种类型活动。 常见的日志文件有:错误日志(error log)、慢查询日志(slow query log)、 查询日志(query log)、二进制文件(bin log)。

错误日志

错误日志文件对 MySQL 的启动、运行、关闭过程进行了记录。遇到问题时 应该首先查看该文件以便定位问题。该文件不仅记录了所有的错误信息,也记录一些警告信息或正确的信息用户可以通过下面命令来查看错误日志文件的位置:

show variables like 'log_error'\G;

Mysql文件存储图文详解

当 MySQL 不能正常启动时,第一个必须查找的文件应该就是错误日志文件, 该文件记录了错误信息。

慢查询日志

慢查询日志可以帮助定位可能存在问题的 SQL 语句,从而进行 SQL 语句层面的优化。

查询日志

查询日志记录了所有对 MySQL 数据库请求的信息,无论这些请求是否得到了正确的执行。

默认文件名:主机名.log

Mysql文件存储图文详解

从 MySQL 5.1 开始,可以将查询日志的记录放入 mysql 架构下的 general_log表

Mysql文件存储图文详解

二进制日志(binlog)

Mysql文件存储图文详解

二进制日志记录了对 MySQL 数据库执行更改的所有操作,若操作本身没有 导致数据库发生变化,该操作可能也会写入二进制文件。但是不包括 select 和 show 这类操作(因为这些操作对数据本身不会进行修改)

binlog几种作用

恢复(recovery)

某些数据的恢复需要二进制日志。

复制

其原理与恢复类似,通过复制和执行二进制日志使一 台远程的 MySQL 数据库(一般称为 slave 或 standby)与一台 MySQL 数据库(一 般称为 master 或 primary)进行实时同步。

审计(有点冷门,db负责)

用户可以通过二进制日志中的信息来进行审计,判断是否有对数据库进行注入的攻击。

总结

到此这篇关于Mysql文件存储的文章就介绍到这了,更多相关Mysql文件存储内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

MySQL 相关文章推荐
MySQL触发器的使用
May 24 MySQL
MySQL 使用事件(Events)完成计划任务
May 24 MySQL
Mysql 用户权限管理实现
May 25 MySQL
MySQL 外键约束和表关系相关总结
Jun 20 MySQL
一文了解MYSQL三大范式和表约束
Apr 03 MySQL
CentOS 7安装mysql5.7使用XtraBackUp备份工具命令详解
Apr 12 MySQL
MySQL中JOIN连接的基本用法实例
Jun 05 MySQL
MySql中的json_extract函数处理json字段详情
Jun 05 MySQL
MySQL数据库之内置函数和自定义函数 function
Jun 16 MySQL
MySQL事务的ACID特性以及并发问题方案
Jul 15 MySQL
MySQL添加索引特点及优化问题
Jul 23 MySQL
MySQL中dd::columns表结构转table过程及应用详解
Sep 23 MySQL
一文读懂navicat for mysql基础知识
Mysql数据库索引面试题(程序员基础技能)
MySQL CHAR和VARCHAR该如何选择
May 31 #MySQL
带你学习MySQL执行计划
May 31 #MySQL
MySQL完整性约束的定义与实例教程
MySQL注入基础练习
解决Navicat for MySQL 连接 MySQL 报2005错误的问题
You might like
PR值查询 | PageRank 查询
2006/12/20 PHP
PHP统计目录下的文件总数及代码行数(去除注释及空行)
2011/01/17 PHP
PHP递归算法的详细示例分析
2013/02/19 PHP
php中JSON的使用方法
2015/04/30 PHP
PHP Imagick完美实现图片裁切、生成缩略图、添加水印
2016/02/22 PHP
(转载)JavaScript中匿名函数,函数直接量和闭包
2007/05/08 Javascript
自己写的Javascript计算时间差函数
2013/10/28 Javascript
js浮点数精确计算(加、减、乘、除)
2013/12/26 Javascript
Visual Studio中js调试的方法图解
2014/06/30 Javascript
文本框只能输入数字的实现方法(兼容IE火狐)
2016/06/25 Javascript
checkbox批量选中,获取选中项的值的简单实例
2016/06/28 Javascript
利用js获取下拉框中所选的值
2016/12/01 Javascript
jquery mobile移动端幻灯片滑动切换效果
2020/04/15 Javascript
electron + vue项目实现打印小票功能及实现代码
2018/11/25 Javascript
vue-drag-chart 拖动/缩放图表组件的实例代码
2020/04/10 Javascript
[01:06:18]DOTA2-DPC中国联赛 正赛 Phoenix vs Dynasty BO3 第二场 1月26日
2021/03/11 DOTA
Python自定义进程池实例分析【生产者、消费者模型问题】
2016/09/19 Python
Python时间获取及转换知识汇总
2017/01/11 Python
如何使用 Pylint 来规范 Python 代码风格(来自IBM)
2018/04/06 Python
如何用Python实现简单的Markdown转换器
2018/07/16 Python
ubuntu16.04制作vim和python3的开发环境
2018/09/23 Python
python判断所输入的任意一个正整数是否为素数的两种方法
2019/06/27 Python
Python matplotlib学习笔记之坐标轴范围
2019/06/28 Python
详解python 利用echarts画地图(热力图)(世界地图,省市地图,区县地图)
2019/08/06 Python
使用 Python 遍历目录树的方法
2020/02/29 Python
python 将视频 通过视频帧转换成时间实例
2020/04/23 Python
详解Django中views数据查询使用locals()函数进行优化
2020/08/24 Python
Pharmacy Online中文直邮网站:澳洲大型药房
2020/06/27 全球购物
致400米运动员广播稿
2014/02/07 职场文书
上班迟到检讨书
2014/09/15 职场文书
英文慰问信
2015/02/14 职场文书
常住证明范本
2015/06/23 职场文书
浅谈redis五大数据结构和使用场景
2021/04/12 Redis
详解python字符串驻留技术
2021/05/21 Python
python中pandas对多列进行分组统计的实现
2021/06/18 Python
SQL Server中使用判断语句(IF ELSE/CASE WHEN )案例
2021/07/07 SQL Server