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

MySQL 主鍵缺失導致 Slave Hang 死實戰分析與修復

     編輯:MySQL 資料庫相關知識

線上頻繁出現 Slave 延遲飆升,經排查發現:用戶刪除數據時,表無主鍵且無索引或過濾性極差,導致 Row 格式 Binlog 在 Slave 回放時逐行全表掃描,直接拖垮複制線程。

現場還原

Seconds_Behind_Master: 1339 且持續增長
Slave_SQL_Running: Yes 但實際卡住

根因分析

表 dmpush_message_temp 無主鍵,UPDATE ... SET stat=1 觸發全表更新。Binlog 行模式下,每行產生一條事件,22 萬行產生 22 萬條事件。Slave 回放時每條事件都全表掃描,IOPS 爆表、CPU 100%,複制彻底卡死。

對比驗證

  • 無主鍵:全表掃描,Binlog 條目數 ≈ 行數,Slave 執行極慢。
  • 加自增主鍵後:Binlog 事件帶上 PK,Slave 走索引定位,秒級完成。

緊急修復步驟

  1. 停止 Slave,若卡住無法操作,kill -9 mysqld。
  2. 跳過故障 Binlog:skip-slave-start 啟動,清空問題表 TRUNCATE TABLE ...,啟動 Slave 並腳本跳過 1032 錯誤。
  3. 追平後回補數據:Master LOCK TABLES ... READ,INSERT SELECT 導出;Slave 關閉 Binlog 重建表回寫。
  4. 通知應用加主鍵:ALTER TABLE ... ADD id INT AUTO_INCREMENT PRIMARY KEY。

自增主鍵的三大好處

  1. 插入性能高(避免頁分裂)。
  2. 二級索引存儲 PK 值,int/bigint 節省空間、提高命中率。
  3. 減少頁碎片,提升空間與記憶體利用率。

結論:主鍵是 InnoDB 生命線,建表預設必加,優先自增整數。

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