該方法只介紹瞭如何救回這個表名 (資料不恢復) 如果想要恢復原來資料 直接用 extundelete 把檔案恢復後放回去即可
 並且是適用於平時沒有全備的情況下  如果有全備 直接那全備的 frm 和 idb 檔案放回去 就可以了
 該方法同樣適用於資料表遷移 (只遷移一個表)  因為 discard 再 import 的速度 遠比先 dump 再恢復的速度要快得多

建議: 平時備份一下表結構是非常重要的 
— 如果你直接刪除了 mysql 的表檔案 (.frm .idb)  在 mysql5.6 可能你就悲劇了  可能再也用不回這個表名了

例子如下
— 全在 datadir 目錄下操作

— 直接刪除了表 tracking20160501 的物理檔案

1
2

rm –rf tracking20160501.*
— 刪除了表 tracking20160501 的 frm 檔案和 idb 檔案

— 此時在資料庫已經看不到該表

1
2

mysql> show tables;
— 檢視資料庫表

— 但若想再建立該表或刪除該表  也許就悲劇了

1
2
3
4
5
6

mysql> create table tracking20160501(id int);
ERROR 1050 (42S01): Table ‘tracking20160501’ already exists                        
— 明明已經看不到該表了 卻顯示錶已存在
mysql> drop table tracking20160501;
ERROR 1051 (42S02): Unknown table ‘kdnet_analyze.tracking20160501’        
— 悲劇了吧 建立不到也刪不到。。

— 檢視一下現在的物理檔案情況

1
2
3

ls tracking20160501.*
tracking20160501.ibd
 — 之前刪除了的表空間檔案 他自己又建立了個出來  可能是剛剛的 create table 命令導致的 這裏不用理

原因: 由於直接刪除了表的物理檔案 但 mysql 的資訊庫 information_schema 或 mysql 庫對該表的資訊還存在 (具體記在哪裏 還沒找出來) 導致 mysql 還認為該表存在 所以建立不了 刪除表時由於又找不到對應的物理檔案 所以也刪除不了  這樣!! 難道這個表名就無法再用了嗎?  有解決方法 如下
解決方法: 
— 找其他表 (最好是表結構一樣的) 這裏找的表叫 ip_taobao 先複製這個表的.frm(表結構) 檔案 改名為誤刪的表名

1
2

cp –a ip_taobao.frm tracking20160501.frm
— 這裏為了保持 mysql 檔案的擁有人和所屬組 所以使用–a 引數

— 如果下面的操作有什麼奇葩問題 可以重啓一下資料庫

— 在 mysql 裏 使用 discard space 命令 廢棄誤刪表的表空間檔案

1

alter table tracking20160501 discard tablespace;

— 再複製 ip_taobao 表的表空間檔案 改名為誤刪的表名

1

cp –a ip_taobao.ibd tracking20160501.ibd                        — 同樣使用–a 保持擁有人和所屬組

— 在 mysql 裏 使用 import space 命令 匯入新的表空間檔案

1
2

mysql> alter table tracking20160501 import tablespace;             — 匯入時間可能會長點
Query OK, 0 rows affected, 5 warnings (7 min 36.94 sec)

— 現在可以正常查詢、刪除和建立回這個表了

1
2
3

mysql> select * from tracking20160501 limit 1
mysql> drop table tracking20160501;
mysql> create table tracking20160501(id int);