錯誤 Error: Tablespace for table 'database.temp' exists. Please DISCARD the tablespace before IMPORT. 通常發生在表空間文件與數據字典不一致時。本文提供標準化排查修復流程。
.ibd 表空間文件殘留,但數據字典中表已被刪除/損壞,InnoDB 拒絕覆蓋孤兒文件# 系統服務管理
systemctl stop mysqld
# 或
service mysql stop
# 進入數據目錄
cd /var/lib/mysql/your_database/
# 列出相關文件
ls -la temp.*
# 典型文件:temp.ibd (表空間)、temp.frm (結構、5.7前)、temp.exp (導出標記)
# 刪除孤兒 .ibd 文件(核心步驟)
rm -f temp.ibd
# 如果有 .exp 文件也刪除
rm -f temp.exp
關鍵原則:僅刪除報錯表對應的 .ibd/.exp 文件,絕不刪除 ibdata1、ib_logfile*、.frm(8.0無)、db.opt。
systemctl start mysqld
# 登錄驗證
mysql -e "USE your_database; SHOW TABLES LIKE 'temp';"
# 應顯示 Empty set
CREATE TABLE `temp` (
`id` INT PRIMARY KEY,
`name` VARCHAR(50)
) ENGINE=InnoDB;
若需保留數據文件進行遷移/恢復:
-- 1. 目標庫釋放表空間
ALTER TABLE `temp` DISCARD TABLESPACE;
-- 生成 temp.cfg 文件,刪除 temp.ibd
-- 2. 複製源庫 .ibd 和 .cfg 到目標庫數據目錄
-- 3. 目標庫導入表空間
ALTER TABLE `temp` IMPORT TABLESPACE;
前提條件:表結構完全一致、MySQL 版本兼容、innodb_file_per_table=ON。
innodb_file_per_table=ON(5.6+ 默認開啟),隔離表級故障SET GLOBAL innodb_fast_shutdown=0 後再停服務,確保緩衝池刷盤| 錯誤信息 | 原因 | 處理 |
|---|---|---|
| Table 'x' doesn't exist | .frm 丟失但 .ibd 存在 | 刪除 .ibd 或恢復 .frm |
| InnoDB: Error: tablespace id mismatch | 表空間 ID 不匹配 | DISCARD/IMPORT 或重建表 |
| InnoDB: Cannot open tablespace | 文件權限/丟失/損壞 | 檢查權限、恢復備份 |
Tablespace 異常本質是 InnoDB 內存數據字典與磁盤文件狀態不一致。標準化修復流程 + 預防性運維體系,能將此類故障影響降至最低。