首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL InnoDB 表僅剩 .ibd/.frm 文件時的數據恢復實戰:表結構導出 + Tablespace 重掛載

     編輯:MySQL 綜合教學

MySQL InnoDB 表僅剩 .ibd/.frm 文件時的數據恢復實戰:表結構導出 + Tablespace 重掛載

場景:服務器異常關機、文件系統損壞、無備份,僅殘留 InnoDB 表的 .frm(結構)與 .ibd(獨立表空間數據)文件。利用 innodb_force_recovery 讀取結構,再通過 DISCARD/IMPORT TABLESPACE 重掛載數據文件,實測可恢復。

前提條件

  • 表引擎為 InnoDB 且啟用 innodb_file_per_table=ON(每表獨立 .ibd)。
  • MySQL 版本一致(主版本號相同),否則 .ibd 格式不兼容。

階段一:恢復表結構(.frm)

  1. 新建臨時庫 recover_db(空庫)。
  2. 建同名空表(引擎必須 InnoDB):CREATE TABLE `t_target` (id BIGINT) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  3. 停止 MySQL:service mysqld stop。
  4. 用原 .frm 覆蓋新建表的 .frm(路徑:datadir/recover_db/t_target.frm)。
  5. 編輯 my.cnf 添加 innodb_force_recovery=1(若失效依次嘗試 2~6,數值越大讀取越激進但風險越大)。
  6. 啟動 MySQL:service mysqld start。
  7. 執行 SHOW CREATE TABLE recover_db.t_target; 獲取完整建表 SQL。

階段二:恢復數據(.ibd)

  1. 按階段一獲得的 SQL 在新庫 recover_db2 建表(結構完全一致)。
  2. 執行 ALTER TABLE t_target DISCARD TABLESPACE; —— 切斷表與 .ibd 關聯,產生警告 Table 'recover_db2/t_target' doesn't exist in engine 正常。
  3. 將原 .ibd 文件複製到 datadir/recover_db2/ 覆蓋同名文件。
  4. 執行 ALTER TABLE t_target IMPORT TABLESPACE; —— 重新掛載 .ibd,若報錯 Schema mismatch 則結構不一致,需核對字段順序、類型、字符集。
  5. 查詢驗證:SELECT * FROM t_target LIMIT 10; 數據應完整顯示。
  6. mysqldump 導出數據遷入生產庫。

關鍵避坑

  • innodb_force_recovery >= 4 會禁止寫入操作,僅用於讀取結構/導出數據,不可長期運行業務。
  • .frm 覆蓋前務必備份原文件,防止不可逆損壞。
  • 若 .ibd 損壞(校驗和錯誤),需專業工具(undrop-for-innodb、Percona Data Recovery Tool)嘗試頁級恢復。
  • MySQL 8.0 移除 .frm,結構存於數據字典,恢復流程不同(需 ibd2sdi 提取 SDI)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved