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批量新增和存储的方法实例
Apr 07 MySQL
浅谈MySQL之浅入深出页原理
Jun 23 MySQL
解决mysql问题:由于找不到MSVCR120.dll,无法继续执行代码
Jun 26 MySQL
MySQL中IF()、IFNULL()、NULLIF()、ISNULL()函数的使用详解
Jun 26 MySQL
浅谈MySQL之select优化方案
Aug 07 MySQL
MySQL去除重叠时间求时间差和的实现
Aug 23 MySQL
MySQL七种JOIN类型小结
Oct 24 MySQL
MySQL中int (10) 和 int (11) 的区别
Jan 22 MySQL
Mysql分析设计表主键为何不用uuid
Mar 31 MySQL
MySQL批量更新不同表中的数据
May 11 MySQL
sql注入报错之注入原理实例解析
Jun 10 MySQL
MySQL实现用逗号进行拼接、以逗号进行分割
Dec 24 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
做个自己站内搜索引擎
2006/10/09 PHP
PHP数组 为文章加关键字连接 文章内容自动加链接
2011/12/29 PHP
php cookie使用方法学习笔记分享
2013/11/07 PHP
四种php中webservice实现的简单架构方法及实例
2015/02/03 PHP
PHP抓取网页、解析HTML常用的方法总结
2015/07/01 PHP
php如何计算两坐标点之间的距离
2018/12/29 PHP
解决windows上php xdebug 无法调试的问题
2020/02/19 PHP
JavaScript 异步调用框架 (Part 6 - 实例 & 模式)
2009/08/04 Javascript
Jquery封装tab自动切换效果的具体实现
2013/07/13 Javascript
2014最热门的JavaScript代码高亮插件推荐
2014/11/25 Javascript
javascript基于DOM实现权限选择实例分析
2015/05/14 Javascript
javascript中传统事件与现代事件
2015/06/23 Javascript
JavaScript与jQuery实现的闪烁输入效果
2016/02/18 Javascript
Angularjs material 实现搜索框功能
2016/03/08 Javascript
原生JS实现图片轮播与淡入效果的简单实例
2016/08/21 Javascript
vue.js利用defineProperty实现数据的双向绑定
2017/04/28 Javascript
简易Vue评论框架的实现(父组件的实现)
2018/01/08 Javascript
vue-cli webpack模板项目搭建及打包时路径问题的解决方法
2018/02/26 Javascript
Vue CLI3 如何支持less的方法示例
2018/08/29 Javascript
如何写好一个vue组件,老夫的一年经验全在这了(推荐)
2019/05/18 Javascript
解决Vue调用springboot接口403跨域问题
2019/09/02 Javascript
基于js实现抽红包并分配代码实例
2019/09/19 Javascript
javascript设计模式 ? 命令模式原理与用法实例分析
2020/04/20 Javascript
[02:10]探秘浦东源深体育馆 DOTA2 Supermajor不见不散
2018/05/17 DOTA
Python字符编码判断方法分析
2016/07/01 Python
python读取与写入csv格式文件的示例代码
2017/12/16 Python
Python面向对象之类的封装操作示例
2019/06/08 Python
python将字符串转换成json的方法小结
2019/07/09 Python
python爬虫使用scrapy注意事项
2020/11/23 Python
Charlotte Tilbury澳大利亚官网:英国美妆品牌
2018/10/05 全球购物
财务主管自我鉴定
2014/01/17 职场文书
应届护士求职信范文
2014/01/26 职场文书
三好学生演讲稿范文
2014/04/26 职场文书
教师年终个人总结
2015/02/11 职场文书
贷款收入证明格式
2015/06/24 职场文书
MySQL 全文检索的使用示例
2021/06/07 MySQL