mysql误删ibd文件
【1】前置条件
(1.1)基本信息
版本:mysql 8.0.22
(1.2)模拟 rm 删除 ibd文件
删除 test库下的 test11.ibd文件
rm /data/mysql/data/test/test11.ibd
【2】情况处理
(2.1)rm 删除 ibd 文件后的影响
以下情况依然可以》
(1)数据库中依然可以查询
(2)给表新增/删除索引—不能发现
以下情况会报错:
(1)对表进行 ALTER TABLE tbl_name ENGINE=INNODB 操作—能发现
(2)对表字段属性进行变更操作—能发现
(3)对表进行 OPTIMIZE 操作—能发现
(4)给表新增/删除字段—能发现(好像其实也可以在8.0)
(2.2)找出在内存文件系统中的该表数据文件 /proc
Linux 内核提供了一种通过 proc 文件系统,在运行时访问内核内部数据结构、改变内核设置的机制。proc 文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间。它以文件系统的方式为访问系统内核数据的操作提供接口。
然后进入该目录下去找,/proc/'mysqld的进程id号/fd'
我们发现是有 test11.ibd文件的
(2.3)恢复ibd文件
执行cp命令,将文件拷贝到原数据目录下
在进行cp之前,要确保该表数据变更已经落盘,且没有新的操作。
cp /proc/2365/fd/41 /data/mysql/data/test/test11.ibd
# 修改文件权限
chown mysql:mysql /data/mysql/data/test/test11.ibd
(2.4)操作前后核验
# 删掉ibd文件后 ERROR 1030 (HY000): Got error 44 - 'InnoDB error' from storage engine root@localhost|test>ALTER TABLE test11 ENGINE=INNODB; ERROR 1030 (HY000): Got error 44 - 'InnoDB error' from storage engine root@localhost|test>ALTER TABLE test11 ENGINE=MYISAM; ERROR 1025 (HY000): Error on rename of './test/test11' to './test/#sql2-93d-b' (errno: 197 - Tablespace cannot be accessed) # 复制文件恢复后=》 root@localhost|test>ALTER TABLE test11 ENGINE=INNODB; Query OK, 0 rows affected (0.13 sec) Records: 0 Duplicates: 0 Warnings: 0
【参考文档】
https://blog.csdn.net/ActionTech/article/details/118723562?spm=1001.2014.3001.5501