在啟用二進制日志(log_bin=ON)的 MySQL 實例上創建存儲函數/觸發器/事件時,常報錯:
ERROR 1418 (HY000): This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators variable)
MySQL 為保證主從複製安全,要求存儲函數確定性:相同輸入必須產生相同輸出,且無副作用。否則主庫執行函數寫入 Binlog,從庫重放時可能產生不同結果,導致數據不一致。
| 聲明 | 含義 | 適用場景 |
|---|---|---|
| DETERMINISTIC | 確定性:相同輸入必得相同輸出 | 純計算函數,無隨機、無時間依賴 |
| NO SQL | 不包含 SQL 語句 | 純邏輯計算、字符串處理 |
| READS SQL DATA | 只讀數據,不修改 | 查詢類函數,含 SELECT |
示例:
CREATE FUNCTION fn_add(a INT, b INT) RETURNS INT
DETERMINISTIC NO SQL
RETURN a + b;
若無法滿足上述聲明(如含 UUID()、NOW()、寫操作),可放寬限制:
-- 運行時動態生效(重啟失效)
SET GLOBAL log_bin_trust_function_creators = 1;
-- 配置文件永久生效
[mysqld]
log_bin_trust_function_creators = 1
⚠️ 風險提示:開啟後,開發者需自行保證函數在主從環境下的複製安全性,MySQL 不再攔截不確定性函數。
log_bin_trust_function_creators=1START SLAVESHOW SLAVE STATUS\G 中 Slave_IO_Running=Yes、Slave_SQL_Running=Yes、Seconds_Behind_Master=0DETERMINISTIC / NO SQL / READS SQL DATA 聲明UUID()、RAND()、NOW()、SYSDATE()ROW 格式 Binlog(binlog_format=ROW)降低函數複製風險理解 ERROR 1418 的複製安全語義,優先通過代碼規範解決,而非單純放寬參數。