MySQL 複制模式(Statement/Row/Mixed)決定了觸發器、存儲過程、用戶定義函數(UDF)及調度事件在主從庫的執行邏輯。理解這些差異對設計高可用架構、避免主從數據不一致至關重要。本文基於官方 5.6 文檔,結合實戰經驗系統闡述。
| 對象 | Statement-Based (SBR) | Row-Based (RBR) | Mixed |
|---|---|---|---|
| Trigger | 主從雙執行,從庫需同樣定義 | 僅主庫執行,從庫只應用行變更,無需定義 | 視具體語句決策 |
| Stored Procedure | 主從雙執行,從庫需定義,必須確定性 | 僅主庫執行,傳遞行變更,從庫無需定義 | 視具體語句決策 |
| Function (UDF) | 主從雙執行,從庫需定義,必須確定性 | 僅主庫執行,傳遞行變更,從庫無需定義 | 視具體語句決策 |
| Event | 主庫創建同步到從庫 (默認 DISABLED) | 同 SBR | 同 SBR |
DEFINER 用戶需存在且權限一致,否則報錯導致復制中斷。INSERT/UPDATE/DELETE 生效,不支持 DDL (如 ALTER TABLE)。CALL proc() 到 Binlog → 從庫重放調用。DEFINER 一致。DETERMINISTIC 或 READS SQL DATA/NO SQL,且不修改數據。若包含 UUID()、RAND() 等非確定性函數,主從執行結果不同 → 數據不一致。DETERMINISTIC。非確定性函數 (如 UUID(), MD5()) 導致主從數據分歧。CREATE EVENT → 同步到從庫 (默認 DISABLED)。ENABLE 該事件,將導致雙重執行:主庫按計劃執行並復制 SQL,從庫本地也按計劃執行 → 嚴重數據不一致。DISABLED,或僅在主庫故障切換後人工啟用。部分舊版博客 (如 LinuxIDC 轉載的 5.5 內容) 認為 SBR 下存儲過程「通過系統函數轉換後的值復制,從庫無需定義」,這與 5.6 官方文檔矛盾。官方明確:SBR 記錄 CALL 語句,從庫重放調用,**必須有定義**。請以官方文檔為準,實測驗證為先。
DETERMINISTIC,確保主從 DEFINER 用戶一致,嚴禁非確定性函數。