CREATE PROCEDURE/FUNCTION、ALTER/DROP 透過 DDL 複寫至從庫,雙端結構保持一致。log_bin_trust_function_creators=1 或建立者具 SUPER 權限。| 物件 | SBR 複寫內容 | RBR 複寫內容 | 注意事項 |
|---|---|---|---|
| 預存程序 | CALL 語句 | 內部 DML 逐行記錄 | RBR 下不重放 CALL,避免雙重執行 |
| 函數 | SELECT func() | 內部 DML 逐行記錄 | 函數不可含顯式 COMMIT/ROLLBACK |
| 觸發器 | 觸發 DML 陳述式 | 觸發器內 DML 逐行記錄 | 觸發器本身不直接複寫,隨觸發表 DML 複寫 |
SUPER,防止非特權用戶建立不安全常式汙染二進制日誌。SET GLOBAL log_bin_trust_function_creators=1; (需重啟持久化)。SUPER 要求,建立常式納入變更管理流程。UUID()、RAND()、NOW()、SYSDATE()、FOUND_ROWS() 等。SLEEP()、基於時間的邏輯。DETERMINISTIC、改用應用層產生隨機值/時間戳傳入參數。IGNORE 語意執行,錯誤被吞噬,不中斷複寫,但可能導致靜默資料差異。# 主庫檢查常式定義
SHOW CREATE PROCEDURE proc_name;
SHOW CREATE FUNCTION func_name;
# 從庫驗證
SHOW SLAVE STATUS\G
# Seconds_Behind_Master = 0 且無錯誤
# 二進制日誌檢查
mysqlbinlog --base64-output=DECODE-ROWS -v binlog.000001 | grep -A5 'CALL\|func_name'
常式與複寫交互的核心矛盾在於程式邏輯的可重放性 vs 分散式一致性。現代架構建議:業務邏輯下沉應用層、資料庫層僅存儲確定性輔助函數、複寫採用 RBR、關鍵路徑強制事務,將複雜度留在可測試、可觀測的應用程式碼中。