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)
log_bin=ON),MySQL 要求創建的函數/存儲過程必須聲明確定性特性:DETERMINISTIC、NO SQL 或 READS SQL DATA,以便安全複製到從庫。log_bin_trust_function_creators=ON。OFF(0),屬於全局動態變量,需 SET GLOBAL 修改。mysql -u root -pSET GLOBAL log_bin_trust_function_creators = 1;
SHOW VARIABLES LIKE 'log_bin_trust_function_creators';
+---------------------------------+-------+
| Variable_name | Value |
+---------------------------------+-------+
| log_bin_trust_function_creators | ON |
+---------------------------------+-------+
my.cnf [mysqld] 區塊添加 log_bin_trust_function_creators=1,重啟後永久生效。| 設置 | 風險 | 建議 |
|---|---|---|
OFF (默認) | 無風險,強制函數聲明確定性 | 嚴格環境、金融核心庫 |
ON | 允許不確定性函數(如 UUID()、NOW())進入 Binlog,導致主從數據不一致 | 開發測試、非關鍵業務、臨時放開創建後再關閉 |
與其開啟不安全開關,不如在函數定義中聲明特性:
CREATE FUNCTION fn_example(p INT) RETURNS INT
DETERMINISTIC -- 相同輸入必產生相同輸出
NO SQL -- 不包含 SQL 語句
-- READS SQL DATA -- 僅讀取數據,不修改
BEGIN
RETURN p * 2;
END;
DETERMINISTIC:優化器可緩存結果,複製安全。NO SQL:純計算函數,最安全。READS SQL DATA:包含 SELECT,不修改數據,複製安全。MODIFIES SQL DATA:修改數據,**禁止**用於 Binlog 環境(會報 1418)。log_bin_trust_function_creators=ON 創建函數後,Binlog 記錄 CREATE FUNCTION 事件。ERROR 1418 是 Binlog 安全機制觸發的保護。首選方案:在函數定義中顯式聲明 DETERMINISTIC / NO SQL / READS SQL DATA;臨時方案:SET GLOBAL log_bin_trust_function_creators=1 創建後再關閉。主從環境務必保持主從參數一致,避免同步中斷。