場景:服務器異常關機、文件系統損壞、無備份,僅殘留 InnoDB 表的 .frm(結構)與 .ibd(獨立表空間數據)文件。利用 innodb_force_recovery 讀取結構,再通過 DISCARD/IMPORT TABLESPACE 重掛載數據文件,實測可恢復。
InnoDB 且啟用 innodb_file_per_table=ON(每表獨立 .ibd)。recover_db(空庫)。CREATE TABLE `t_target` (id BIGINT) ENGINE=InnoDB DEFAULT CHARSET=utf8;service mysqld stop。.frm 覆蓋新建表的 .frm(路徑:datadir/recover_db/t_target.frm)。my.cnf 添加 innodb_force_recovery=1(若失效依次嘗試 2~6,數值越大讀取越激進但風險越大)。service mysqld start。SHOW CREATE TABLE recover_db.t_target; 獲取完整建表 SQL。recover_db2 建表(結構完全一致)。ALTER TABLE t_target DISCARD TABLESPACE; —— 切斷表與 .ibd 關聯,產生警告 Table 'recover_db2/t_target' doesn't exist in engine 正常。.ibd 文件複製到 datadir/recover_db2/ 覆蓋同名文件。ALTER TABLE t_target IMPORT TABLESPACE; —— 重新掛載 .ibd,若報錯 Schema mismatch 則結構不一致,需核對字段順序、類型、字符集。SELECT * FROM t_target LIMIT 10; 數據應完整顯示。mysqldump 導出數據遷入生產庫。innodb_force_recovery >= 4 會禁止寫入操作,僅用於讀取結構/導出數據,不可長期運行業務。undrop-for-innodb、Percona Data Recovery Tool)嘗試頁級恢復。ibd2sdi 提取 SDI)。