記錄生產環境高可用切換、Event 復制行為差異、深分頁 SQL 優化等實戰案例,供同類問題快速參考。
主庫宕機,MHA 自動將候選從庫提升為新主,原主庫重啟後 SHOW SLAVE STATUS 為空。
CHANGE MASTER TO 命令:grep "All other slaves should start" /var/log/manager.logCHANGE MASTER TO MASTER_HOST='new_master' ... 指向新主。START SLAVE; 啟動復制線程。SET GLOBAL read_only=1; 設為只讀,防止誤寫入。Seconds_Behind_Master=0 後,刪除 app1.failover.complete 允許 MHA 再次監控。SET GLOBAL relay_log_purge=0; 防止中繼日志被過早清理。SLAVESIDE_DISABLED 導致切換後事件不執行主庫 ALTER EVENT ... ENABLE 不會同步到從庫,從庫事件保持 SLAVESIDE_DISABLED。切換後新主庫事件仍處於禁用狀態。
-- 生成所有庫的 EVENT 啟用語句
SELECT CONCAT('ALTER EVENT `', EVENT_SCHEMA, '`.`', EVENT_NAME, '` ENABLE;')
FROM information_schema.EVENTS
WHERE STATUS = 'SLAVESIDE_DISABLED';
在新主庫批量執行輸出語句,並納入切換後驗證清單。
LIMIT 60000,20 從 2s 降至 50msKEY idx_2_qstatus_opstatus_sc_so (QuestionStatus, OperateStatus, Age, Score, Source) KEY idx_2_ctime_qstatus_opstatus (CreateTime, QuestionStatus, OperateStatus, CatalogID, Age)
EXPLAIN SELECT * FROM question_2 WHERE QuestionStatus >= 0 AND OperateStatus = 2 AND Age IN (1,2) ORDER BY qid DESC LIMIT 60000,20; -- type=ALL, rows=400萬, Using where; Using filesort
qid(避免回表)。EXPLAIN SELECT * FROM question_2
INNER JOIN (
SELECT qid FROM question_2
WHERE QuestionStatus >= 0 AND OperateStatus = 2 AND Age IN (1,2)
ORDER BY qid DESC LIMIT 60000,20
) a USING (qid);
-- 內層:type=ref, rows≈360萬, Using index; 外層:eq_ref, rows=1
| 指標 | 優化前 | 優化後 |
|---|---|---|
| 執行時間 | ~2.1 s | ~0.05 s |
| 掃描行數 | 400 萬 | ~6 萬(索引掃描) |
| 臨時表 | Using filesort | 無 |
WHERE + ORDER BY 列。ORDER BY pk DESC 可利用索引逆序掃描。運維核心在於「預案先行、腳本自動化、變更可回滾」。MHA 切換後必須驗證 Event 狀態、read_only、復制延遲;深分頁優化首選「延遲關聯」或「游標分頁」。