gululululu 2020-02-12
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;
数据恢复