首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 複製報錯 Last_SQL_Errno:1146 解決實戰:Transportable Tablespace 遷移導致從庫斷裂

     編輯:MySQL 資料庫相關知識

錯誤現象

使用 TTS 遷移數據時,從庫 SQL 線程報錯:

Last_SQL_Errno: 1146
Last_SQL_Error: Error 'Table 'spider.tb_city_population_rank' doesn't exist' on query.
Default database: 'spider'. Query: 'alter table tb_city_population_rank discard tablespace'

或:

Last_SQL_Error: Error 'Table 'spider.tb_city_population_rank' doesn't exist' on query.
Default database: 'spider'. Query: 'alter table tb_city_population_rank import tablespace'

決策框架:三個關鍵問題

  1. 整庫容量多大?
  2. 業務容忍最大延遲多久?
  3. 重建從庫 vs 修復從庫,哪個更快、風險更低?

TTS 遷移流程回顧(主庫 A → 從庫 B)

  1. A: SHOW CREATE TABLE xxx1 獲取建表語句
  2. B: CREATE TABLE xxx1 建表,ALTER TABLE xxx1 DISCARD TABLESPACE 刪除 .ibd
  3. A: FLUSH TABLES xxx1,xxx2 FOR EXPORT 刷新內存生成 .cfg
  4. A: scp xxx1.ibd xxx1.cfg B:/data/ 拷貝文件
  5. B: ALTER TABLE xxx1 IMPORT TABLESPACE 導入

錯誤 1:DISCARD TABLESPACE 找不到表

Last_SQL_Error: ... 'alter table tb_city_population_rank discard tablespace'

原因:從庫磁盤只有 .ibd,缺 .frm(表定義)。SQL 線程重放主庫的 DISCARD 時,表已不存在。

修復步驟:

  1. 備份 .ibd:mv tb_city_population_rank.ibd tb_city_population_rank.ibd.bak
  2. 從主庫獲取建表語句,在從庫執行 CREATE TABLE ... 生成 .frm
  3. 啟動 SQL 線程:START SLAVE SQL_THREAD,執行 DISCARD,.ibd 再次消失
  4. 報錯轉為 IMPORT 階段錯誤

錯誤 2:IMPORT TABLESPACE 找不到表

Last_SQL_Error: ... 'alter table tb_city_population_rank import tablespace'

:

  1. 恢復 .ibd:mv tb_city_population_rank.ibd.bak tb_city_population_rank.ibd
  2. 啟動 SQL 線程:START SLAVE SQL_THREAD,IMPORT 成功
  3. 驗證:SELECT * FROM tb_city_population_rank LIMIT 100;

多表遷移通用策略

「缺什麼補什麼,多什麼減什麼」:按報錯順序逐表修復,核心邏輯是讓從庫文件系統狀態與主庫 binlog 事件預期一致。

補充:主主復制 1146 簡易處理

SET GLOBAL sql_slave_skip_counter=20;
STOP SLAVE; START SLAVE;

跳過錯誤事件(謹慎使用,可能導致數據不一致)。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved