16_MySQL数据文件

数据文件

在MySQL 中每一个数据库都会在定义好(或者默认)的数据目录下存在一个以数据库名字命名的文件夹,用来存放该数据库中各种表数据文件。不同的MySQL 存储引擎有各自不同的数据文件。如MyISAM 用“.MYD”作为扩展名,Innodb 用“.ibd”,Archive 用“.arc”,CSV 用“.csv”,等等。

//登录mysql,创建一个数据库如t1,并在数据库中创建一个表

mysql> create database t1;
Query OK, 1 row affected (0.00 sec)

mysql> use t1;
Database changed
mysql> create table tt1 
    -> (
    -> id int,
    -> name char(22),
    -> info char(22),
    -> deptid int
    -> );
Query OK, 0 rows affected (0.01 sec)

//查看数据库所在目录会发现数据目录下存在一个以数据库名字命名的文件夹
在这里插入图片描述
查看t1目录的文件列表
从上图可以看出表使用的是innodb存储引擎。

修改mysql的默认存储引擎

//查看mysql存储引擎命令,Support为:Default表示默认存储引擎

mysql> show engines;
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine             | Support | Comment                                                        | Transactions | XA   | Savepoints |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| InnoDB             | DEFAULT | Supports transactions, row-level locking, and foreign keys     | YES          | YES  | YES        |
| MRG_MYISAM         | YES     | Collection of identical MyISAM tables                          | NO           | NO   | NO         |
| MEMORY             | YES     | Hash based, stored in memory, useful for temporary tables      | NO           | NO   | NO         |
| BLACKHOLE          | YES     | /dev/null storage engine (anything you write to it disappears) | NO           | NO   | NO         |
| MyISAM             | YES     | MyISAM storage engine                                          | NO           | NO   | NO         |
| CSV                | YES     | CSV storage engine                                             | NO           | NO   | NO         |
| ARCHIVE            | YES     | Archive storage engine                                         | NO           | NO   | NO         |
| PERFORMANCE_SCHEMA | YES     | Performance Schema                                             | NO           | NO   | NO         |
| FEDERATED          | NO      | Federated MySQL storage engine                                 | NULL         | NULL | NULL       |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
9 rows in set (0.00 sec)

//设置InnoDB为默认引擎
在配置文件my.cnf中的 [mysqld] 下面加入default-storage-engine=INNODB 一句即可

[root@mysqld01 ~]# grep default /etc/my.cnf 
default-storage-engine=MyISAM 
[root@mysqld01 t1]# systemctl restart mysqld

//验证

mysql> mysql> show engines;
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine             | Support | Comment                                                        | Transactions | XA   | Savepoints |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| InnoDB             | YES     | Supports transactions, row-level locking, and foreign keys     | YES          | YES  | YES        |
| MRG_MYISAM         | YES     | Collection of identical MyISAM tables                          | NO           | NO   | NO         |
| MEMORY             | YES     | Hash based, stored in memory, useful for temporary tables      | NO           | NO   | NO         |
| BLACKHOLE          | YES     | /dev/null storage engine (anything you write to it disappears) | NO           | NO   | NO         |
| MyISAM             | DEFAULT | MyISAM storage engine                                          | NO           | NO   | NO         |
| CSV                | YES     | CSV storage engine                                             | NO           | NO   | NO         |
| ARCHIVE            | YES     | Archive storage engine                                         | NO           | NO   | NO         |
| PERFORMANCE_SCHEMA | YES     | Performance Schema                                             | NO           | NO   | NO         |
| FEDERATED          | NO      | Federated MySQL storage engine                                 | NULL         | NULL | NULL       |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
9 rows in set (0.00 sec)

1、“.frm”文件 与表相关的元数据(meta)信息都存放在“.frm”文件中,包括表结构的定义信息等。不论是什么存储引擎(MySQL常用的两个存储引擎是MyISAM和InnoDB),每一个表都会有一个以表名命名的“.frm”文件。所有的“.frm”文件都存放在所属数据库的文件夹下面。
MyISAM数据库表文件:.MYD文件:表数据文件;.MYI文件:索引文件

2、“.MYD”文件 “.MYD”文件是MyISAM存储引擎专用,存放MyISAM 表的数据。每一个MyISAM 表都会有一个“.MYD”文件与之对应,同样存放于所属数据库的文件夹下,和“.frm”文件在一起。

3、“.MYI”文件 “.MYI”文件也是专属于MyISAM 存储引擎的,主要存放MyISAM 表的索引相关信息。对于MyISAM 存储来说,可以被cache 的内容主要就是来源于“.MYI”文件中。每一个MyISAM 表对应一个“.MYI”文件,存放于位置和“.frm”以及“.MYD”一样。

InnoDB采用表空间(tablespace)来管理数据,存储表数据和索引。 .ibd文件:单表表空间文件,每个表使用一个表空间文件(file per table),存放用户数据库表数据和索引。 InnoDB共享表空间(即InnoDB文件集,ibfile set):ibdata1、ibdata2等,存储InnoDB系统信息和用户数据库表数据和索引,所有表共用。

4、“.ibd”文件和ibdata 文件 这两种文件都是存放Innodb 数据的文件,之所以有两种文件来存放Innodb 的数据(包括索引),是因为Innodb 的数据存储方式能够通过配置来决定是使用共享表空间存放存储数据,还是独享表空间存放存储数据。独享表空间存储方式使用“.ibd”文件来存放数据,且每个表一个“.ibd”文件,文件存放在和MyISAM数据相同的位置。如果选用共享存储表空间来存放数据,则会使用ibdata 文件来存放,所有表共同使用一个(或者多个,可自行配置)ibdata 文件。 ibdata 文件可以通过innodb_data_home_dir 和innodb_data_file_path两个参数共同配置组成, innodb_data_home_dir 配置数据存放的总目录, 而innodb_data_file_path 配置每一个文件的名称。 innodb_data_file_path 中可以一次配置多个ibdata 文件。文件可以是指定大小,也可以是自动扩展的,但是Innodb 限制了仅仅只有最后一个ibdata 文件能够配置成自动扩展类型。当我们需要添加新的ibdata 文件的时候,只能添加在innodb_data_file_path配置的最后,而且必须重启MySQL 才能完成ibdata 的添加工作。不过如果我们使用独享表空间存储方式的话,就不会有这样的问题。

总结: 共享表空间以及独占表空间都是针对数据的存储方式而言的。 共享表空间: 某一个数据库的所有的表数据,索引文件全部放在一个文件中。 独占表空间: 每一个表都将会生成以独立的文件方式来进行存储,每一个表都有一个.frm表描述文件,还有一个.ibd文件。其中这个文件包括了单独一个表的数据内容以及索引内容。 两者之间的优缺点 共享表空间: 优点: 可以放表空间分成多个文件存放到各个磁盘上。数据和文件放在一起方便管理。 缺点: 所有的数据和索引存放到一个文件中,多个表及索引在表空间中混合存储,这样对于一个表做了大量删除操作后表空间中将会有大量的空隙,特别是对于统计分析,日值系统这类应用最不适合用共享表空间。 独立表空间: 优点: 1.每个表都有自已独立的表空间。 2.每个表的数据和索引都会存在自已的表空间中。 3.可以实现单表在不同的数据库中移动。 4.空间可以回收 a) Drop table操作自动回收表空间,如果对于统计分析或是日值表,删除大量数据后可以通过:alter table TableName engine=innodb;回缩不用的空间。 b)对于使用独立表空间的表,不管怎么删除,表空间的碎片不会太严重的影响性能,而且还有机会处理。 缺点: 单表增加过大,如超过100个 G。 相比较之下,使用独占表空间的效率以及性能会更高一点。

//查看当前数据库的表空间管理类型

mysql> show variables like '%innodb_file_per%';
+-----------------------+-------+
| Variable_name         | Value |
+-----------------------+-------+
| innodb_file_per_table | ON    |
+-----------------------+-------+
1 row in set (0.00 sec)

ON代表独立表空间管理,OFF代表共享表空间管理;(查看单表的表空间管理方式,需要查看每个表是否有单独的数据文件)

Innodb共享表空间配置: 修改my.cnf文件:

innodb_file_per_table=0
innodb_data_file_path=ibdata1:100M:autoextend
innodb_data_home_dir=/usr/local/mysql/data

参数解释:
innodb_data_home_dir = “/path/” 数据库文件所存放的目录
innodb_log_group_home_dir ="/path/" 日志存放目录
innodb_data_file_path=ibdata1:10M:autoextend 设置一个可扩展大小的尺寸为10MB的数据文件(共享数据文件),名为ibdata1。没有给出文件的位置,所以默认的是在MySQL的数据目录内。
innodb_file_per_table=1|0 //1为使用独占表空间,0 为使用共享表空间 注:InnoDB不创建目录,所以在启动服务器之前请确认”所配置的路径目录”的确存在。

重启mysqld服务
//mysqld启动失败,查看错误日志

#tail -20 /usr/local/mysql/data/mysqld.err

显示内容如下:

2019-12-29T06:53:44.635783Z 0 [ERROR] InnoDB: The Auto-extending innodb_system
data file '/usr/local/mysql/data/ibdata1' is of a different size 4864 pages
(rounded down to MB) than specified in the .cnf file: initial 6400 pages, max 0
(relevant if non-zero) pag

注:不同版本的mysql报错略有不同,注意看错误日志的内容。 从错误日志中显示可以看出在/etc/my.cnf文件中设置6400页而当前ibdata1为4864页 需要计算4864/64=76 修改配置为`

innodb_data_file_path=ibdata1:76M:autoextend

重启mysqld服务
启动mysql,成功!

注:计算公式:64pages相当于1M,1page是16KB 如果不清楚默认文件page大小,可以先 du -hibdata1 查看下,再去设置;

登录mysql执行mysql> show variables like ‘%innodb_file_per_table%’;
这时新建的表就会使用共享表空间了。

mysql>  show variables like '%innodb_file_per_table%';
+-----------------------+-------+
| Variable_name         | Value |
+-----------------------+-------+
| innodb_file_per_table | OFF   |
+-----------------------+-------+
1 row in set (0.00 sec)

3.Replication相关文件:

1)master.info 文件: master.info 文件存在于Slave 端的数据目录下,里面存放了该Slave 的Master 端的相关信息,包括Master 的主机地址,连接用户,连接密码,连接端口,当前日志位置,已经读取到的日志位置等信息。
2)relay log 和relay log index mysql-relay-bin.xxxxxn 文件用于存放Slave 端的I/O 线程从Master 端所读取到的Binary Log 信息,然后由Slave 端的SQL 线程从该relay log 中读取并解析相应的日志信息,转化成Master 所执行的SQL 语句,然后在Slave 端应用。 mysql-relay-bin.index 文件的功能类似于mysql-bin.index ,同样是记录日志的存放位置的绝对路径,只不过他所记录的不是Binary Log,而是Relay Log。
3)relay-log.info 文件: 类似于master.info,它存放通过Slave 的I/O 线程写入到本地的relay log 的相关信 息。供Slave 端的SQL 线程以及某些管理操作随时能够获取当前复制的相关信息。
4.其他文件:

1)system config file MySQL 的系统配置文件一般都是my.cnf,默认存放在"/etc"目录下,my.cnf文件中包含多种参数选项(group),每一种参数组都通过中括号给定了固定的组名,如“[mysqld]”组中包括了mysqld服务启动时候的初始化参数,“[client]”组中包含着客户端工具程序可以读取的参数。

2)pidfile pid file 是mysqld 应用程序在Unix/Linux 环境下的一个进程文件,和许多其他 Unix/Linux 服务端程序一样,存放着自己的进程id。

3)socket file socket 文件也是在Unix/Linux 环境下才有的,用户在Unix/Linux 环境下客户端连接可以不通过TCP/IP 网络而直接使用Unix Socket 来连接MySQL。 mysql有两种连接方式,常用的一般是tcp mysql –h mysql主机ip -uroot -pxxx mysql -S /path/mysql.sock注:采用unix socket连接方式,比用tcp的方式更快,但只适用于mysql和应用同在一台PC上。

猜你喜欢

转载自blog.csdn.net/weixin_45310323/article/details/112253967