mysql表物理文件被誤刪的解決方法
因?yàn)槭д`不小心誤刪了mysql表的物理文件,這個(gè)時(shí)候該怎么辦呢?以下是從從網(wǎng)上找的解決的方法,有需要的朋友們可以參考借鑒。
1、該方法只介紹了如何救回這個(gè)表名(數(shù)據(jù)不恢復(fù)) 如果想要恢復(fù)原來(lái)數(shù)據(jù) 直接用extundelete把文件恢復(fù)后放回去即可
2、并且是適用于平時(shí)沒(méi)有全備的情況下 如果有全備 直接那全備的frm和idb文件放回去 就可以了
3、該方法同樣適用于數(shù)據(jù)表遷移(只遷移一個(gè)表) 因?yàn)閐iscard再import的速度 遠(yuǎn)比先dump再恢復(fù)的速度要快得多
建議: 平時(shí)備份一下表結(jié)構(gòu)是非常重要的
-- 如果你直接刪除了mysql的表文件 (.frm .idb) 在mysql5.6 可能你就悲劇了 可能再也用不回這個(gè)表名了
例子如下
-- 全在datadir目錄下操作
-- 直接刪除了表 tracking20160501的物理文件
1
2
rm -rf tracking20160501.*
-- 此時(shí)在數(shù)據(jù)庫(kù)已經(jīng)看不到該表
-- 但若想再創(chuàng)建該表或刪除該表 也許就悲劇了
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'
|
-- 查看一下現(xiàn)在的物理文件情況
1
2
3
ls tracking20160501.*
tracking20160501.ibd
原因: 由于直接刪除了表的物理文件 但mysql的信息庫(kù) information_schema 或 mysql 庫(kù)對(duì)該表的信息還存在(具體記在哪里 還沒(méi)找出來(lái)) 導(dǎo)致mysql還認(rèn)為該表存在 所以創(chuàng)建不了 刪除表時(shí)由于又找不到對(duì)應(yīng)的物理文件 所以也刪除不了 這樣!! 難道這個(gè)表名就無(wú)法再用了嗎?
有解決方法 如下
-- 找其他表(最好是表結(jié)構(gòu)一樣的) 這里找的表叫ip_taobao 先復(fù)制這個(gè)表的.frm(表結(jié)構(gòu))文件 改名為誤刪的表名
1 2 | cp -a ip_taobao.frm tracking20160501.frm
|
-- 如果下的操作有什么奇葩問(wèn)題 可以重啟一下數(shù)據(jù)庫(kù)
-- 在mysql里 使用discard space命令 廢棄誤刪表的表空間文件
1 | alter table tracking20160501 discard tablespace;
|
-- 再?gòu)?fù)制ip_taobao表的表空間文件 改名為誤刪的表名
1 | cp -a ip_taobao.ibd tracking20160501.ibd
|
-- 在mysql里 使用import space命令 導(dǎo)入新的表空間文件
1
2
mysql>
alter
table
tracking20160501 import tablespace;
Query OK, 0
rows
affected, 5 warnings (7
min
36.94 sec)
-- 現(xiàn)在可以正常查詢、刪除和創(chuàng)建回這個(gè)表了
1 2 3 | mysql> select * from tracking20160501 limit 1
mysql> drop table tracking20160501;
mysql> create table tracking20160501(id int );
|
以上就是這篇文章的全部?jī)?nèi)容了,希望對(duì)大家?guī)?lái)幫助。