1. 数据库和文件系统的关系
像 InnoDB 、 MyISAM 这样的存储引擎都是把表存储在文件系统上的。当我们想读取数据的时候,这些存储引擎会从文件系统中把数据读出来返回给我们,当我们想写入数据的时候,这些存储引擎会把这些数据又写回文件系统。
2.MySQL数据目录
区别于MySQL安装目录(安装目录存储了许多控制服务器和客户端程序的命令),数据目录是用来存储MySQL在运行过程中产生的数据
2.1 查找MySQL数据目录的位置
因为数据目录是记录在系统变量’datadir’中的,因此直接输入命令就在找到
mysql> SHOW VARIABLES LIKE 'datadir';
2.2 数据目录的结构
已知数据目录位置,我们创建的数据库就会在该文件夹下面生成一个同名子目录,并在这个子目录下创建一个名为db.opt的文件,这个文件包含该数据库的各种属性,如字符集/比较规则等
如下图为数据库tcc—cap目录下的内容,它包含表结构的定义和表数据
2.3 文件系统中InnoDB表的表示
对于 InnoDB 存储引擎的数据表,一个表对应两个文件,一个是 *.frm,存储表结构信息;一个是 *.ibd,存储表中数据。
2.4 存储表数据
InnoDB中的数据是以页为基本单位的,为了更好的管理这些页,MySQL引入了表空间,它可以对应文件系统上一个或多个真实文件。每一个表空间可以被划分为很多很多很多个页,我们的表数据就存放在某个表空间下的某些页里。
2.4.1 系统表空间
默认情况下,InnoDB会在数据目录下创建一个名为ibdata1、大小为12M的文件,这个文件就是对应的系统表空间在文件系统上的表示。
在一个MySQL服务器中,系统表空间只有一份。从MySQL5.5.7到MySQL5.6.6之间的各个版本中,我们表中的数据都会被默认存储到这个 系统表空间。
2.4.2 独立表空间
在MySQL5.6.6以及之后的版本中,InnoDB并不会默认的把各个表的数据存储到系统表空间中,而是为每一个表建立一个独立表空间,也就是说我们创建了多少个表,就有多少个独立表空间。使用独立表空间来存储表数据的话,会在该表所属数据库对应的子目录下创建一个表示该独立表空间的文件,文件名和表名相同,只不过添加了一个.ibd的扩展名而已
2.5 文件系统中MyISAM表的表示
因为该存储引擎的数据和索引是分开存放的。所以在文件系统中也是使用不同的文件来存储数据文件和索引文件。而且和InnoDB不同的是,MyISAM并没有什么所谓的表空间一说,表数据都存放到对应的数据库子目录下。
因此在构成上,MyISAM需要比innoDB多一个文件,并且文件的后缀名也与innoDB存在区别:
- test.frm
- test.MYD
- test.MYI
2.6 文件系统中视图的表示
因为视图实际上是一种虚拟的表,并没有实际数据的存在,因此只需要用一个*.frm文件存储在对应的数据库子目录即可。
2.7 数据目录下的其他的文件
- 服务器进程文件。
我们知道每运行一个MySQL服务器程序,都意味着启动一个进程。MySQL服务器会把自己的进程ID写入到一个文件中。
- 服务器日志文件。
在服务器运行过程中,会产生各种各样的日志,也需要被存储。
- 默认/自动生成的SSL和RSA证书和密钥文件。
3.文件系统对数据库的影响
- 文件名长度的影响
数据库产生的文件,文件名受限于文件系统支持的最大长度 - 文件大小的影响
对于数据库中的文件,它们受限于文件系统所支持的最大文件大小 - 特殊字符的影响
为了避免因为数据库名和表名出现某些特殊字符而造成文件系统不支持的情况,MySQL会把数据库名和表名中所有除数字和拉丁字母以外的所有字符在文件名里都映射成 @+编码值的形式作为文件名。
4.MySQL系统数据库
MySQL会默认存在几个系统数据库
- information_schema
- information_schema提供了访问数据库元数据的方式。(元数据是关于数据的数据,如数据库名或表名,列的数据类型,或访问权限等。有时用于表述该信息的其他术语包括“数据词典”和“系统目录”。)
- 换句换说,information_schema是一个信息数据库,它保存着关于MySQL服务器所维护的所有其他数据库的信息。(如数据库名,数据库的表,表栏的数据类型与访问权 限等。) 在INFORMATION_SCHEMA中,有几张只读表。它们实际上是视图,而不是基本表。
- 查看具体表:
- mysql
- mysql的核心数据库,类似于sql server中的master表,主要负责存储数据库的用户、权限设置、关键字等mysql自己需要使用的控制和管理信息。(常用的,在mysql.user表中修改root用户的密码)。
- performance_schema
- 主要用于收集数据库服务器性能参数。并且库里表的存储引擎均为PERFORMANCE_SCHEMA,而用户是不能创建存储引擎为PERFORMANCE_SCHEMA的表。MySQL5.7默认是开启的。
- sys
- Sys库所有的数据源来自:performance_schema。目标是把performance_schema的把复杂度降低,让DBA能更好的阅读这个库里的内容。让DBA更快的了解DB的运行情况。