用戶嘗試開啟 Binlog 重啟失敗,隨後刪除 ibdata1、ib_logfile0/1,MySQL 能正常啟動(自動重建系統表空間),但 SHOW TABLES 可見表名,SELECT 卻報 ERROR 1146: Table doesn't exist,錯誤日誌提示 Cannot open table ... from the internal data dictionary of InnoDB though the .frm file exists。
InnoDB 獨立表空間模式下,每張表擁有 .ibd 數據檔與 .frm 定義檔。若表結構一致,可通過 DISCARD/IMPORT TABLESPACE 將孤立的 .ibd 掛載回新建的表定義中,實現數據找回。
.frm、.ibd 至安全位置(如 /backup/)。ALTER TABLE t DISCARD TABLESPACE; 丟棄新建表的空 .ibd。.ibd 複製回目錄,修正擁有者 chown mysql:mysql。ALTER TABLE t IMPORT TABLESPACE; 掛載數據檔。FLUSH TABLE t; 刷新表定義快取,驗證 SELECT * FROM t; 正常。✅ 成功,數據完整可讀。
✅ 成功,FLUSH TABLE 後列名恢復為原定義。
⚠️ 僅能讀取前 N 列(與新定義匹配的列),其餘列數據不可訪問。
❌ FLUSH TABLE 後報 Table doesn't exist,數據字典與表空間元數據不匹配導致表不可用。
DATETIME 改為 VARCHAR)💥 SELECT 瞬間導致 MySQL 進程崩潰(Lost connection to MySQL server during query)。
刪除 ibdata1 會導致 mysql 庫下 5 張 InnoDB 系統表不可用:
innodb_index_stats, innodb_table_stats, slave_master_info, slave_relay_log_info, slave_worker_info
需手動重建(參考 MySQL 官方文檔或 Percona 部落格腳本)。
SHUTDOWN 或 systemctl stop)後刪除系統表空間檔案,保證 .ibd 處於一致狀態。IMPORT TABLESPACE 後務必 FLUSH TABLE 驗證。