热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

mysqlfrm文件打开_面试官:当你误删某张数据库表的frm和ibd文件时,该如何恢复?...

概述之所以做这个实验,也是有个朋友误删了某张表的frm和ibd文件,然后要导入数据的时候一直提示无法重新创建这张表,这时候应该怎么解决呢&

概述

之所以做这个实验,也是有个朋友误删了某张表的frm和ibd文件,然后要导入数据的时候一直提示无法重新创建这张表,这时候应该怎么解决呢?我们用一个实验来看看。。


一、环境准备

CREATE TABLE `t` ( `id` int(11) DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8;CREATE TABLE `t2` ( `id` int(11) DEFAULT NULL) ENGINE=myisam DEFAULT CHARSET=utf8;insert into t values(1);insert into t values(2);insert into t values(3);insert into t2 values(1);insert into t2 values(2);

763ee6730123eff8422330dc2cd3948e.png

二、手动删除frm和ibd文件

rm -rf t.frm t.ibdrm -rf t2.frm t2.MYD t2.MYI

6ad9b83837ab4fd7cd375b1ab160ad5d.png

三、在没关闭数据库且会话窗口没关闭的情况下查看

select * from t;select * from t2;

9a67a633569fee88149302ea9f51a2e5.png

四、新开会话窗口(未关闭数据库)

以下ERROR 29 (HY000): File './test/t2.MYD' not found (Errcode: 2 - No such file or directory)提示表明t2数据库文件损坏了

6d30366c343d45433fb30505263db15b.png

测试在t表表结构不存在的时候插入数据,发现可以插入成功

mysql> insert into t values(4);Query OK, 1 row affected (0.06 sec)mysql> select * from t;

c6d409295965711dba42abf6046f0704.png

五、备份t表

重启之前得在其他数据库新建t表结构,然后复制frm文件到原数据库即可

7896a65777ad24204553a04e5bfad02a.png

六、重新创建t2表及数据

因为myisam不需要记录信息到数据字典,所以drop后重建就行了

drop table t2;CREATE TABLE `t2` ( `id` int(11) DEFAULT NULL) ENGINE=myisam DEFAULT CHARSET=utf8;insert into t2 values(1);insert into t2 values(2);

ba00b88a127d505c3926fc171d166185.png

此时t2表结构和数据已经恢复

43cdb970c824d7929145ddaa9edd1f42.png

七、重启数据库后测试

# systemctl restart mysqldmysql> select * from t;ERROR 1146 (42S02): Unknown error 1146mysql> drop table t;ERROR 1051 (42S02): mysql> CREATE TABLE `t` ( -> `id` int(11) DEFAULT NULL -> ) ENGINE=InnoDB DEFAULT CHARSET=utf8;ERROR 1050 (42S01): Unknown error 1050

aeac9ed8ec2a2030a0497438bc0207e6.png

八、测试一下修复表

可以发现修复不成功

mysql> check table t;mysql> repair table t;

55a160cbe1ad41c0ea555521ef901088.png

九、不停机情况下拷贝其他库的t表

考虑到在使用innoDB引擎的数据库中,其实际数据不是存放在数据库目录下的,而是放在一个叫ibdata1的文件内(默认配置时),其目录下只是放置了数据库的表及表结构相关的信息。这里在其他库上建立t表及数据,然后将这个表复制到test库下

use mysql;CREATE TABLE `t` ( `id` int(11) DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8;insert into t values(1);insert into t values(2);insert into t values(3);insert into t values(4);# cp t.frm ../test/# mysql -uroot -pmysql> select * from t;ERROR 1017 (HY000): Unknown error 1017

aaf96fcd61f52d329b8656601f4d9fd8.png

拷贝后发现还是没有恢复成功


十、数据库升级

升级后还是没有恢复成功

mysql_upgrade -uroot -p --forcemysql> select * from t;ERROR 1017 (HY000): Unknown error 1017

330f0be0144f71f495f89c0ce0b95830.png

十一、重新创建t表(引擎为myisam)(该方法不能恢复为innodb引擎,废弃)

因为共享表空间记录了信息

CREATE TABLE `t` ( `id` int(11) DEFAULT NULL) ENGINE=myisam DEFAULT CHARSET=utf8;insert into t values(1);insert into t values(2);insert into t values(3);insert into t values(4);alter table t engine=innodb;drop table t;

fef69a6ae32532df50b2987d0f256a31.png

十二、修改配置文件恢复(最终选择)

配置文件的一个参数:innodb_force_recovery

innodb_force_recovery 会影响整个InnoDB存储引擎的恢复状况。默认为0,表示当需要恢复时执行所有的

innodb_force_recovery可以设置为1-6,大的数字包含前面所有数字的影响。当设置参数值大于0后,可以对表进行

select,create,drop操作,但insert,update或者delete这类操作是不允许的。

(SRV_FORCE_IGNORE_CORRUPT):忽略检查到的corrupt页。(SRV_FORCE_NO_BACKGROUND):阻止主线程的运行,如主线程需要执行full purge操作,会导致crash。(SRV_FORCE_NO_TRX_UNDO):不执行事务回滚操作。(SRV_FORCE_NO_IBUF_MERGE):不执行插入缓冲的合并操作。(SRV_FORCE_NO_UNDO_LOG_SCAN):不查看重做日志,InnoDB存储引擎会将未提交的事务视为已提交。(SRV_FORCE_NO_LOG_REDO):不执行前滚的操作。

1、在mysql库创建t表及数据

use mysql;CREATE TABLE `t` ( `id` int(11) DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8;insert into t values(1);insert into t values(2);insert into t values(3);insert into t values(4);

2、停止数据库

 systemctl stop mysqld

3、复制frm和ibd文件

# cp -a ../mysql/t.frm .# cp -a ../mysql/t.ibd .

cae2dad84242cdada18ce1d5cf0cd33d.png

4、修改参数

 在my.cnf设置参数innodb_force_recovery = 6

ab1eb889f8165d9acf64c377ee1eb9b2.png

5、两次启动数据库

启动mysql,再关闭mysql 把配置innodb_force_recovery = 6给删除了,然后启动mysql

9d49fedd66219ff9db03d987d38ee883.png

6、drop 表后重建

提示ERROR 1813 (HY000): Tablespace '`test`.`t`' exists或ERROR 1813 (HY000): Unknown error 1813都是表空间问题

36b4cfdb0ec2a97fe59b85243ee3e033.png

此时只需要删除对应的.ibd文件即可或者alter table t discard tablespace;来删除

ab9fa1e3ba2c1ce14ec108b81c9f0a34.png

综上:

1、误删数据文件时不要忙着重启数据库,先查看表是否存在,做一下备份

2、定期备份是很重要的

3、以上innodb表实际上只恢复了表结构,表数据并没有恢复,可以考虑通过mysqlbinlog进行回退

觉得有用的朋友多帮忙转发哦!后面会分享更多devops和DBA方面的内容,感兴趣的朋友可以关注下~

3c7292b5e124e490fe50e76c1403506a.gif



推荐阅读
  • 在Oracle11g以前版本中的的DataGuard物理备用数据库,可以以只读的方式打开数据库,但此时MediaRecovery利用日志进行数据同步的过 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • 本文主要复习了数据库的一些知识点,包括环境变量设置、表之间的引用关系等。同时介绍了一些常用的数据库命令及其使用方法,如创建数据库、查看已存在的数据库、切换数据库、创建表等操作。通过本文的学习,可以加深对数据库的理解和应用能力。 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文详细介绍了MysqlDump和mysqldump进行全库备份的相关知识,包括备份命令的使用方法、my.cnf配置文件的设置、binlog日志的位置指定、增量恢复的方式以及适用于innodb引擎和myisam引擎的备份方法。对于需要进行数据库备份的用户来说,本文提供了一些有价值的参考内容。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 本文讨论了在数据库打开和关闭状态下,重新命名或移动数据文件和日志文件的情况。针对性能和维护原因,需要将数据库文件移动到不同的磁盘上或重新分配到新的磁盘上的情况,以及在操作系统级别移动或重命名数据文件但未在数据库层进行重命名导致报错的情况。通过三个方面进行讨论。 ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • 本文介绍了深入浅出Linux设备驱动编程的重要性,以及两种加载和删除Linux内核模块的方法。通过一个内核模块的例子,展示了模块的编译和加载过程,并讨论了模块对内核大小的控制。深入理解Linux设备驱动编程对于开发者来说非常重要。 ... [详细]
  • Python SQLAlchemy库的使用方法详解
    本文详细介绍了Python中使用SQLAlchemy库的方法。首先对SQLAlchemy进行了简介,包括其定义、适用的数据库类型等。然后讨论了SQLAlchemy提供的两种主要使用模式,即SQL表达式语言和ORM。针对不同的需求,给出了选择哪种模式的建议。最后,介绍了连接数据库的方法,包括创建SQLAlchemy引擎和执行SQL语句的接口。 ... [详细]
  • MySQL语句大全:创建、授权、查询、修改等【MySQL】的使用方法详解
    本文详细介绍了MySQL语句的使用方法,包括创建用户、授权、查询、修改等操作。通过连接MySQL数据库,可以使用命令创建用户,并指定该用户在哪个主机上可以登录。同时,还可以设置用户的登录密码。通过本文,您可以全面了解MySQL语句的使用方法。 ... [详细]
  • 本文介绍了使用哈夫曼树实现文件压缩和解压的方法。首先对数据结构课程设计中的代码进行了分析,包括使用时间调用、常量定义和统计文件中各个字符时相关的结构体。然后讨论了哈夫曼树的实现原理和算法。最后介绍了文件压缩和解压的具体步骤,包括字符统计、构建哈夫曼树、生成编码表、编码和解码过程。通过实例演示了文件压缩和解压的效果。本文的内容对于理解哈夫曼树的实现原理和应用具有一定的参考价值。 ... [详细]
author-avatar
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有