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

MySQL 複製報錯 Last_SQL_Errno 1146 根因分析與三級修復方案:TTS 遷移場景實戰

     編輯:MySQL 綜合教學

前言

Last_SQL_Errno: 1146(Table doesn't exist)是在 Transportable Tablespace(TTS)跨實例遷移、並行複製、DDL 衝突場景下的高頻錯誤。本文深度剖析 TTS 遷移流程中 1146 產生的時序根因,提供「補齊定義→重放」、「跳過事務」、「重建 Slave」三級修復方案,並給出預防清單。

一、TTS 遷移標準流程與 1146 產生點

# 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 爆發點:

  • 步驟 4 執行後、步驟 6 前,表處於「有 .frm 無 .ibd」狀態
  • 若 Slave SQL Thread 此時重放 Master 的 DISCARD TABLESPACE / IMPORT TABLESPACE,找不到表定義 → 1146
  • 並行複製(slave_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

三、三級修復方案

Level 1:補齊定義 + 重放(推薦,數據零損失)

-- 假設錯誤發生在 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;

Level 2:跳過錯誤事務(緊急止血,風險可控)

-- 僅適用非 GTID 模式
STOP SLAVE;
SET GLOBAL sql_slave_skip_counter = 1;  -- DISCARD + IMPORT 通常同一事務組,跳 1 或 2
START SLAVE;
-- 事後必須:pt-table-checksum 校驗一致性,不一致用 pt-table-sync 修復

Level 3:重建 Slave(徹底乾淨,適用大面積 1146)

  1. Master 全量備份:xtrabackup --backup --target-dir=/backup/full
  2. 傳輸備份到 Slave,xtrabackup --prepare、--copy-back
  3. 修正 auto.cnf(server_uuid)、my.cnf(server_id、replication 參數)
  4. 啟動 Slave,CHANGE MASTER TO MASTER_AUTO_POSITION=1

四、預防清單:從源頭杜絕 1146

  1. 遷移窗口停寫:業務層面暫停寫入該表,或使用 FLUSH TABLES WITH READ LOCK(影響面大,慎用)
  2. 關閉並行複製:遷移期間 SET GLOBAL slave_parallel_workers=0,避免 DDL 亂序
  3. GTID + AUTO_POSITION:天然免疫位點錯亂,跳過事務更安全
  4. 原子化腳本:將步驟 3-6 封裝為單一 Shell/Python 腳本,中間無人工干預
  5. 驗證清單:遷移後 CHECK TABLE tbl、SELECT COUNT(*) 對比 Master

五、其他場景的 1146 快速判斷

場景典型原因處理
DDL 複製衝突Master DROP TABLE,Slave 尚未重放 CREATE跳過 DROP 或重建表
異構複製(5.7→8.0)數據字典表結構差異、視圖/函數不兼容升級前 mysqlcheck --check-upgrade
手工誤刪 .ibd運維誤操作從備份恢復 .ibd + IMPORT TABLESPACE
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved