InnoDB存储引擎物理存储结构
ibdata1 : 系统数据字典信息(统计信息),UNDO表空间等数据
ib_logfile0 ~ ib_logfile1 : REDO日志文件,事务日志文件。
ibtmp1 : 临时表空间磁盘位置,存储临时表
frm : 存储表的列信息
ibd : 表的数据行和索引
共享表空间
需要将所有数据存储到同一个表空间中 ,管理比较混乱
5.5 版本出现的管理模式, 也是默认的管理模式。
5.6 版本, 共享表空间保留,只用来存储:数据字典信息,undo,临时表。
5.7 版本, 临时表被独立出来了
8.0 版本, undo也被独立出去了
select @@innodb_data_file_path;
+-------------------------+
| @@innodb_data_file_path |
+-------------------------+
| ibdata1:12M:autoextend |
+-------------------------+
# 这里的目录是 my.cnf 中 datadir定义的目录
mysql> show variables like \'%extend%\';
+-----------------------------+-------+
| Variable_name | Value |
+-----------------------------+-------+
| innodb_autoextend_increment | 64 |
+-----------------------------+-------+
# 每次增长64M
独立表空间
从 5.6 后,默认表空间不再使用共享表空间,替换为独立表空间。
独立表空间主要存储的是用户数据,存储特点为:一个表一个ibd文件,存储数据行和索引信息
MySQL的存储引擎日志:
Redo Log: ib_logfile0,ib_logfile1,重做日志
Undo Log: ibdata1 ibdata2(存储在共享表空间中),回滚日志
临时表:ibtmp1,在做join union操作产生临时数据,用完就自动清除
查看是否开启独立表空间
select @@innodb_file_per_table;
+-------------------------+
| @@innodb_file_per_table |
+-------------------------+
| 1 |
+-------------------------+
表空间迁移
alter table klvchen.t2 discard tablespace; # 注意这个命令会删除 ibd 文件,需要提前备份
alter table klvchen.t2 import tablespace;
# 若 t2.frm 损坏,t2.ibd 数据还在,可以通过建立一个相同表空间,重命名为 t2.frm
虽然 t2.ibd 还在,但是 mysql 无法识别
处理方式:
# 在 mysql 中重建一个相同表结构的 tmp 表
CREATE TABLE `tmp` (
`id` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
# 在 mysql datadir 中复制 frm 文件
cp tmp.frm t2.frm
chowm mysql.mysql t2.frm
# 备份 t2.ibd
cp t2.ibd /tmp
# 在 mysql 中执行 discard tablespace
alter table klvchen.t2 discard tablespace;
# 把备份的 t2.ibd 文件恢复到位置
cp /tmp/t2.ibd .
chowm mysql.mysql t2.ibd
# 在 mysql 中执行 import tablespace
alter table klvchen.t2 import tablespace;
数据恢复