巡檢發現從庫無業務負載卻單核 CPU 100%,主庫慢查詢無寫入 SQL。經分析 Binlog 定位到高頻 DELETE/INSERT 的表 xx_db.xxtable,結合 SHOW ENGINE INNODB STATUS 發現大量 GEN_CLUST_INDEX 鎖與表級鎖,根因為該表缺少顯式主鍵。新增無業務意義的自增主鍵後,CPU 瞬間降至 3%,複寫延遲徹底消除。
Seconds_Behind_Master 持續增長。工具:parsebinlog(mysql-binlog-statistic)
git clone https://github.com/wubx/mysql-binlog-statistic.git cd mysql-binlog-statistic/bin/ parsebinlog /u1/mysql/logs/mysql-bin.000806 ... Table xx_db.xxtable: Type DELETE opt: 101246 Type INSERT opt: 103265 ...
單 Binlog 內同一表超 10 萬次 DELETE + INSERT,極高頻寫入。
mysql> SHOW ENGINE INNODB STATUS\G ... ---TRANSACTION ..., ACTIVE 3 sec fetching rows mysql tables in use 1, locked 1 3361 lock struct(s), heap size 407992, 477888 row lock(s) TABLE LOCK table xx_db.xxtable trx id ... lock mode IX RECORD LOCKS space id 1002 page no 1975 n bits 1120 index `AK_movieid` ... RECORD LOCKS space id 1002 page no 6965 n bits 264 index `GEN_CLUST_INDEX` ... ... (TOO MANY LOCKS PRINTED) ...
GEN_CLUST_INDEX:InnoDB 為無主鍵表自動生成的 6 字節隱藏叢集索引(Row ID)。GEN_CLUST_INDEX 記錄鎖:隱藏主鍵按插入順序遞增,導致頁面分裂、鎖競爭劇烈。lock mode IX)降低並發度。ALTER TABLE xx_db.xxtable ADD COLUMN id INT AUTO_INCREMENT PRIMARY KEY;
效果:
Seconds_Behind_Master → SHOW SLAVE STATUS → Binlog 統計 → SHOW ENGINE INNODB STATUS 鎖分析 → 結合結構優化。