Last_SQL_Errno: 1146(Table doesn't exist)是在 Transportable Tablespace(TTS)跨實例遷移、並行複製、DDL 衝突場景下的高頻錯誤。本文深度剖析 TTS 遷移流程中 1146 產生的時序根因,提供「補齊定義→重放」、「跳過事務」、「重建 Slave」三級修復方案,並給出預防清單。
# Master
1. SHOW CREATE TABLE tbl; -- 獲取建表語句
2. FLUSH TABLES tbl FOR EXPORT; -- 刷髒頁、產生 .cfg 元數據
# Slave
3. CREATE TABLE tbl (...); -- 建空表結構
4. ALTER TABLE tbl DISCARD TABLESPACE; -- 刪除 .ibd,只留 .frm
# 文件傳輸
5. scp tbl.ibd tbl.cfg slave:/data/mysql/db/
# Slave 繼續
6. ALTER TABLE tbl IMPORT TABLESPACE; -- 導入 .ibd
# Master
7. UNLOCK TABLES;
1146 爆發點:
DISCARD TABLESPACE / IMPORT TABLESPACE,找不到表定義 → 1146slave_parallel_workers>0)可能打亂 TTS 相關 DDL 的執行順序,加劇風險| 錯誤信息 | 階段 | 缺失文件 |
|---|---|---|
Error 'Table db.tbl doesn't exist' ... Query: 'ALTER TABLE tbl DISCARD TABLESPACE' | 重放 DISCARD | .frm / .ibd 均無 |
Error 'Table db.tbl doesn't exist' ... Query: 'ALTER TABLE tbl IMPORT TABLESPACE' | 重放 IMPORT | 有 .frm 無 .ibd |
-- 假設錯誤發生在 IMPORT 階段,Slave 已有 .frm 無 .ibd
-- 1. 備份現狀(如有殘留 .ibd)
mv /data/mysql/db/tbl.ibd /data/mysql/db/tbl.ibd.bak
-- 2. 確認表結構(從 Master 或備份獲取)
SHOW CREATE TABLE db.tbl\G
-- 3. 重建表結構(若 .frm 損壞)
DROP TABLE IF EXISTS tbl;
CREATE TABLE `tbl` ( ... ) ENGINE=InnoDB;
-- 4. 執行 DISCARD TABLESPACE(清理剛建的空 .ibd)
ALTER TABLE tbl DISCARD TABLESPACE;
-- 5. 放入正確 .ibd(從備份恢復或重新 scp)
mv /data/mysql/db/tbl.ibd.bak /data/mysql/db/tbl.ibd
# 或 scp master:/data/mysql/db/tbl.ibd /data/mysql/db/
-- 6. 執行 IMPORT TABLESPACE
ALTER TABLE tbl IMPORT TABLESPACE;
-- 7. 啟動 SQL Thread
START SLAVE SQL_THREAD;
-- 僅適用非 GTID 模式
STOP SLAVE;
SET GLOBAL sql_slave_skip_counter = 1; -- DISCARD + IMPORT 通常同一事務組,跳 1 或 2
START SLAVE;
-- 事後必須:pt-table-checksum 校驗一致性,不一致用 pt-table-sync 修復
xtrabackup --backup --target-dir=/backup/fullxtrabackup --prepare、--copy-backauto.cnf(server_uuid)、my.cnf(server_id、replication 參數)CHANGE MASTER TO MASTER_AUTO_POSITION=1FLUSH TABLES WITH READ LOCK(影響面大,慎用)SET GLOBAL slave_parallel_workers=0,避免 DDL 亂序CHECK TABLE tbl、SELECT COUNT(*) 對比 Master| 場景 | 典型原因 | 處理 |
|---|---|---|
| DDL 複製衝突 | Master DROP TABLE,Slave 尚未重放 CREATE | 跳過 DROP 或重建表 |
| 異構複製(5.7→8.0) | 數據字典表結構差異、視圖/函數不兼容 | 升級前 mysqlcheck --check-upgrade |
| 手工誤刪 .ibd | 運維誤操作 | 從備份恢復 .ibd + IMPORT TABLESPACE |