简介
文件系统:操作系统用来管理磁盘的功能,像 InnoDB、 MyISAM 这样的存储引擎都是把表存储在文件系统上。
安装目录:用来存储关于控制客户端程序和服务器程序的命令(如 mysql,mysqld,mysqld_safe 等)。
1 | mysql> show variables like 'basedir'; |
数据目录:用来存储 MySQL 在运行过程中产生的数据。
1 | mysql> show variables like 'datadir'; |
系统数据库
mysql它存储了
MySQL的用户账户和权限信息,一些存储过程、事件的定义信息,一些运行过程中产生的日志信息,一些帮助信息以及时区信息等。information_schema存储了
MySQL服务器维护的所有其他数据库的信息,比如有表、视图、触发器、列、索引等信息,这些并不是真实的用户数据,而是一些描述性信息,有时候也称之为元数据。performance_schema存储了
MySQL服务器运行过程中的一些状态信息,算是对MySQL服务器的一个性能监控。包括统计最近执行了哪些语句,在执行过程的每个阶段都花费了多长时间,内存的使用情况等。sys主要是通过视图的形式把
information_schema和performance_schema结合起来,让程序员可以更方便的了解MySQL服务器的一些性能。
目录结构
数据库
每个数据库都对应数据目录下的一个子目录,或者说对应一个文件夹。
1 | mysql> show databases; |
1 | . |
- ibdata1:系统表的空间文件,
undo信息保存在系统文件ibdata1。 - ib_logfile0:保存
InnoDB引擎表的事务日志信息,其文件大小尺寸固定,不可以改变。 - *.index:索引文件,用于记录哪些日志文件正在被使用。
- mysql-binlog.*:记录数据库所有的
DDL和DML(除了数据查询语句)语句事件。
表
InnoDB表
1 | . |
系统表空间(system tablespace)
ibdata1 是一个自扩展文件,默认 12M,配置文件可配置任意大小,不够用的时候会自己增加文件大小
1 | innodb_data_home_dir = /data/mysql |
Tips:从
MySQL 5.5.7到MySQL 5.6.6之间的各个版本中,我们表中的数据都会被默认存储到这个系统表空间
独立表空间(file-per-table tablespace)
在 MySQL 5.6.6 以及之后的版本,InnoDB 并不会默认的把各个表的数据存储到系统表空间中,而是为每一个表建立一个独立表空间。
1 | test.ibd # 用来存储test表中的数据和索引 |
innodb_file_per_table:指定使用系统表空间还是独立表空间来存储数据,该参数只对新建的表起作用,对于已经分配了表空间的表并不起作用。
当
innodb_file_per_table的值为0时,代表使用系统表空间当
innodb_file_per_table的值为1时,代表使用独立表空间
1 | mysql> show variables like 'innodb_file_per_table'; |
MyISAM表
MyISAM 并没有什么所谓的表空间一说,表数据都存放到对应的数据库子目录下,在 MyISAM 中的索引全部都是二级索引,该存储引擎的数据和索引是分开存放的,所以在文件系统中也是使用不同的文件来存储数据文件和索引文件。
1 | test.frm # 表结构文件 |
视图
视图是虚拟的表,也就是某个查询语句的一个别名而已,所以在存储视图的时候是不需要存储真实的数据的,只需要把它的结构存储起来就行了。和表一样描述视图结构的文件也会被存储到所属数据库对应的子目录下边,只会存储一个 视图名.frm 的文件。
1 | . |
其他文件
数据目录除了存储数据文件以外,还包括为了更好运行程序的一些额外文件,主要包括这几种类型的文件:
进程文件
MySQL 服务器会把自己的进程 ID 写入到一个文件中 mysql.pid
日志文件
在 mysqld 服务运行过程中,会产生各种各样的日志,例如:查询日志、错误日志、二进制日志、redo 日志等
如何修改数据存储目录?
背景:随着数据量的增长,MySQL 数据所占的空间会越来越大,而默认情况下 MySQL 数据盘空间可能不够,这时候,就需要修改存储路径。
实施操作
- 停服务
1 | /etc/init.d/mysqld stop |
- 迁移目录
1 | mkdir /data_sdb/mysql |
- 修改配置文件
my.cnf - 启动服务
- 重新配置主从关系
1 | CHANGE MASTER TO |