基本概念
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 | mysql> set global innodb_file_per_table =ON; |
想要将共享表空间转化为独立表空间有两种方法:
先逻辑备份,然后修改配置文件
my.cnf
中的参数innodb_file_per_table
参数为1
,重启服务后将逻辑备份导入即可。修改配置文件
my.cnf
中的参数innodb_file_per_table
参数为1
,重启服务后将需要修改的所有innodb
表都执行一遍:alter table table_name engine=innodb;
使用第二种方式修改后,原来库中的表中的数据会继续存放于ibdata1
中,新建的表才会使用独立表空间。
操作实战
1 | # 导出所有数据 |