MySQL 存储引擎 (二)

gululululu 2020-02-12

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

MySQL 存储引擎 (二)
虽然 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;

MySQL 存储引擎 (二)
数据恢复

相关推荐