centos7恢复mysql数据库_mysql误删数据库表的frm文件和ibd文件?试试这样恢复

本文介绍了如何在CentOS7上恢复误删的MySQL数据库表,特别是针对frm和ibd文件丢失的情况。通过修改innodb_force_recovery参数,实现了在不停机情况下恢复表结构,但数据未恢复。强调了误删数据后的应急措施,定期备份的重要性,以及利用mysqlbinlog进行数据回退的可能性。
摘要由CSDN通过智能技术生成

概述

之所以做这个实验,也是有个朋友误删了某张表的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);
9a3666fe6c867fb4123985c4d256abaa.png

二、手动删除frm和ibd文件

rm -rf t.frm t.ibdrm -rf t2.frm t2.MYD t2.MYI
0a82a2c6428fdcac0cb92923e604570e.png

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

select * from t;select * from t2;
b044f902769e50348b5326f45e22c96c.png

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

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

5936afc08d16dc58a1232407a136c1ac.png

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

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

五、备份t表

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

ccdf204b855e2acb0c8027cfade621e5.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);
cd06bd216a8239e03efd6480a978c55f.png

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

dac9daba39ddcda3044929b27345611f.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
6de08be7540ed69348171e67e1c201a5.png

八、测试一下修复表

可以发现修复不成功

mysql> check table t;mysql> repair table t;
872da7eb55de722330a3da282db1a537.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
0716edb625c06b669f660146341af516.png

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


十、数据库升级

升级后还是没有恢复成功

mysql_upgrade -uroot -p --forcemysql> select * from t;ERROR 1017 (HY000): Unknown error 1017
f9933ad2aad7d9eef1f611af7532997b.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;
9a6d750c2c4a450a045dcf4850e83f52.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 .
3f13c9696ecd096925e1b4ab6adf274e.png

4、修改参数

 在my.cnf设置参数innodb_force_recovery = 6
37936aa61c4fea51e944488d907f6226.png

5、两次启动数据库

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

3e39c4f7f311e4a6f4ea14e25dd1ccca.png

6、drop 表后重建

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

abc72d6dbd8f2160c07b4a897e957478.png

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

1b9ce60640225a2204dd0eccaf6bcae0.png

综上:

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

2、定期备份是很重要的

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

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

cef6708251c7d57b25c1b273dbc23d69.gif
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值