二、手动删除frm和ibd文件
rm -rf t.frm t.ibdrm -rf t2.frm t2.MYD t2.MYI
三、在没关闭数据库且会话窗口没关闭的情形下查看
select from t;select from t2;
四、新开会话窗口(未关闭数据库)
以下ERROR 29 (HY000): File './test/t2.MYD' not found (Errcode: 2 - No such file or directory)提示表明t2数据库文件破坏了

测试在t表表构造不存在的时候插入数据,创造可以插入成功
mysql> insert into t values(4);Query OK, 1 row affected (0.06 sec)mysql> select from t;
五、备份t表
重启之前得在其他数据库新建t表构造,然后复制frm文件到原数据库即可
六、重新创建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);
此时t2表构造和数据已经规复
七、重启数据库后测试
# 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
八、测试一下修复表
可以创造修复不堪利
mysql> check table t;mysql> repair table t;
九、一直机情形下拷贝其他库的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
拷贝后创造还是没有规复成功
十、数据库升级升级后还是没有规复成功
mysql_upgrade -uroot -p --forcemysql> select from t;ERROR 1017 (HY000): Unknown error 1017
十一、重新创建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;
十二、修正配置文件规复(终极选择)
配置文件的一个参数: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 .
4、修正参数
在my.cnf设置参数innodb_force_recovery = 6
5、两次启动数据库
启动mysql,再关闭mysql 把配置innodb_force_recovery = 6给删除了,然后启动mysql
6、drop 表后重修
提示ERROR 1813 (HY000): Tablespace '`test`.`t`' exists或ERROR 1813 (HY000): Unknown error 1813都是表空间问题
此时只须要删除对应的.ibd文件即可或者alter table t discard tablespace;来删除
综上:
1、误删数据文件时不要忙着重启数据库,先查看表是否存在,做一下备份
2、定期备份是很主要的
3、以上innodb表示实上只规复了表构造,表数据并没有规复,可以考虑通过mysqlbinlog进行回退
以为有用的朋友多帮忙转发哦!
后面会分享更多devops和DBA方面的内容,感兴趣的朋友可以关注下~