zl程序教程

您现在的位置是:首页 >  数据库

当前栏目

mysql误删ibd文件

mysql文件 误删
2023-09-11 14:21:08 时间

【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