MySQL 5.1 引入儲存程序與函數支援,其在複寫環境下的行為備受關注。本文以問答形式系統說明複寫機制、安全限制與已知限制。
| 問題 | 回答 |
|---|---|
| 儲存程序/函數執行是否複寫? | 是。標準行為從主庫複寫到從庫 |
| CREATE/ALTER/DROP 陳述式是否複寫? | 是。DDL 操作會複寫,兩端結構保持一致 |
| 程式內部 DML 如何複寫? | 記錄每個 DML 事件並逐條複寫,不複寫 CALL 執行呼叫本身 |
因從庫執行來自主庫二進制日誌的任意陳述式,存在安全風險。DBA 有兩種選項:
SUPER 權限SET GLOBAL log_bin_trust_routine_creators = 1,允許擁有 CREATE ROUTINE 權限的用戶建立程序RAND()、UUID() 等結果不可預測,從庫無法重現主庫結果NOW()、SYSDATE() 依賴執行時刻,二進制日誌僅記錄 DML 不含時間約束,從庫重放時會產生不同結果DETERMINISTIC 或設定 log_bin_trust_routine_creators=0 仍允許呼叫,但複寫結果不一致風險由開發者自負IGNORE 模式執行,錯誤被忽略不複寫到從庫pt-table-checksum 等工具)理解這些機制與限制,能幫助架構師在複寫環境下正確設計儲存程序,避免資料不一致風險。