mysql表物理文件被误删的解决方法
前言
1、该方法只介绍了如何救回这个表名(数据不恢复)如果想要恢复原来数据直接用extundelete把文件恢复后放回去即可
2、并且是适用于平时没有全备的情况下 如果有全备直接那全备的frm和idb文件放回去就可以了
3、该方法同样适用于数据表迁移(只迁移一个表) 因为discard再import的速度远比先dump再恢复的速度要快得多
建议:平时备份一下表结构是非常重要的
--如果你直接删除了mysql的表文件(.frm.idb) 在mysql5.6可能你就悲剧了 可能再也用不回这个表名了
例子如下
--全在datadir目录下操作
--直接删除了表tracking20160501的物理文件
rm-rftracking20160501.* --删除了表tracking20160501的frm文件和idb文件
--此时在数据库已经看不到该表
mysql>showtables; --查看数据库表
--但若想再创建该表或删除该表 也许就悲剧了
mysql>createtabletracking20160501(idint); ERROR1050(42S01):Table'tracking20160501'alreadyexists --明明已经看不到该表了却显示表已存在 mysql>droptabletracking20160501; ERROR1051(42S02):Unknowntable'kdnet_analyze.tracking20160501' --悲剧了吧创建不到也删不到。。
--查看一下现在的物理文件情况
lstracking20160501.* tracking20160501.ibd --之前删除了的表空间文件他自己又创建了个出来可能是刚刚的createtable命令导致的这里不用理
原因:由于直接删除了表的物理文件但mysql的信息库information_schema或mysql库对该表的信息还存在(具体记在哪里还没找出来)导致mysql还认为该表存在所以创建不了删除表时由于又找不到对应的物理文件所以也删除不了 这样!!难道这个表名就无法再用了吗?
有解决方法如下
--找其他表(最好是表结构一样的)这里找的表叫ip_taobao先复制这个表的.frm(表结构)文件改名为误删的表名
cp-aip_taobao.frmtracking20160501.frm --这里为了保持mysql文件的拥有人和所属组所以使用-a参数
--如果下面的操作有什么奇葩问题可以重启一下数据库
--在mysql里使用discardspace命令废弃误删表的表空间文件
altertabletracking20160501discardtablespace;
--再复制ip_taobao表的表空间文件改名为误删的表名
cp-aip_taobao.ibdtracking20160501.ibd--同样使用-a保持拥有人和所属组
--在mysql里使用importspace命令导入新的表空间文件
mysql>altertabletracking20160501importtablespace;--导入时间可能会长点 QueryOK,0rowsaffected,5warnings(7min36.94sec)
--现在可以正常查询、删除和创建回这个表了
mysql>select*fromtracking20160501limit1 mysql>droptabletracking20160501; mysql>createtabletracking20160501(idint);
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。