MySQL · InnoDB 数据存储

基本概念

InnoDB 存储引擎可将所有数据存放于 ibdata* 的共享表空间,也可将每张表存放于独立的 .ibd 文件的独立表空间。共享表空间以及独立表空间都是针对数据的存储方式而言的。

共享表空间: 某一个数据库的所有的表数据,索引文件全部放在一个文件中,默认这个共享表空间的文件路径在 data 目录下, 默认的文件名为 ibdata1,初始化为 10M

独立表空间: 每一个表都将会生成以独立的文件方式来进行存储,每一个表都有一个 .frm 表描述文件,还有一个 .ibd 文件。 其中这个文件包括了单独一个表的数据内容以及索引内容,默认情况下它的存储位置也是在表的位置之中。

优缺点

共享表空间

优点:可以将表空间分成多个文件存放到各个磁盘上(表空间文件大小不受表大小的限制,如一个表可以分布在不同的文件上),数据和文件放在一起方便管理。

缺点:所有的数据和索引存放到一个文件中,虽然可以把一个大文件分成多个小文件,但是多个表及索引在表空间中混合存储,这样对于一个表做了大量删除操作后表空间中将会有大量的空隙,特别是对于统计分析这类应用最不适合用共享表空间。

独立表空间:在配置文件(my.cnf)中设置 innodb_file_per_table

优点:

  • 每个表都有自已独立的表空间。
  • 每个表的数据和索引都会存在自已的表空间中。
  • 可以实现单表在不同的数据库中移动。
  • 空间可以回收(除 drop table 操作处,表空不能自已回收)。

缺点

  • 单表增加过大,如超过100G。
  • 相比较之下,使用独占表空间的效率以及性能会更高一点。

参数详解

Command-Line Format --innodb_file_per_table
System Variable Name innodb_file_per_table
Variable Scope Global
Dynamic Variable Yes
Permitted Values (<= 5.6.5) Type boolean
Default OFF
Permitted Values (>= 5.6.6) Type boolean
Default ON

修改 InnoDB 数据存储方式:

1
2
3
4
5
6
7
mysql> set global innodb_file_per_table =ON;  
mysql> show variables like '%per_table%';
+-----------------------+-------+
| Variable_name | Value |
+-----------------------+-------+
| innodb_file_per_table | ON |
+-----------------------+-------+

想要将共享表空间转化为独立表空间有两种方法:

  1. 先逻辑备份,然后修改配置文件 my.cnf 中的参数 innodb_file_per_table 参数为 1,重启服务后将逻辑备份导入即可。

  2. 修改配置文件 my.cnf 中的参数 innodb_file_per_table 参数为 1,重启服务后将需要修改的所有 innodb 表都执行一遍:alter table table_name engine=innodb; 使用第二种方式修改后,原来库中的表中的数据会继续存放于 ibdata1 中,新建的表才会使用独立表空间。

操作实战

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 导出所有数据
mysqldump -u <user> -p <password> --all-databases --master-data=2 --single-transaction > backup.sql

# 删除所有数据库
drop database database_N

# 停止MySQL服务
service mysql stop / service mariadb stop

# 删除文件 ibdata1, ib_logfile0, ib_logfile1
rm -rf xxx

# 修改MySQL配置文件/etc/my.cnf,增加或修改如下:
[mysqld]
innodb_file_per_table=1

# 重启MySQL服务
service mysql start

# 导入备份数据
mysql -u <user> -p <password> < backup.sql