- 工信部備案號 滇ICP備05000110號-1
- 滇公安備案 滇53010302000111
- 增值電信業務經營許可證 B1.B2-20181647、滇B1.B2-20190004
- 云南互聯網協會理事單位
- 安全聯盟認證網站身份V標記
- 域名注冊服務機構許可:滇D3-20230001
- 代理域名注冊服務機構:新網數碼
mysql表物理文件被誤刪的解決方法
因為失誤不小心誤刪了mysql表的物理文件,這個時候該怎么辦呢?以下是從從網上找的解決的方法,有需要的朋友們可以參考借鑒。
1、該方法只介紹了如何救回這個表名(數據不恢復) 如果想要恢復原來數據 直接用extundelete把文件恢復后放回去即可
2、并且是適用于平時沒有全備的情況下 如果有全備 直接那全備的frm和idb文件放回去 就可以了
3、該方法同樣適用于數據表遷移(只遷移一個表) 因為discard再import的速度 遠比先dump再恢復的速度要快得多
建議: 平時備份一下表結構是非常重要的
-- 如果你直接刪除了mysql的表文件 (.frm .idb) 在mysql5.6 可能你就悲劇了 可能再也用不回這個表名了
例子如下
-- 全在datadir目錄下操作
-- 直接刪除了表 tracking20160501的物理文件
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' -- 悲劇了 創建不到也刪不到。。 |
-- 查看一下現在的物理文件情況
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命令 導入新的表空間文件
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 ); |
以上就是這篇文章的全部內容了,希望對大家帶來幫助。
售前咨詢
售后咨詢
備案咨詢
二維碼
TOP