萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

MySQL 創建函數報錯 1418:log_bin_trust_function_creators 參數詳解與修復

錯誤現象

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)

根因分析

  • 開啟了 Binlog(log_bin=ON),MySQL 要求創建的函數/存儲過程必須聲明確定性特性:DETERMINISTIC、NO SQL 或 READS SQL DATA,以便安全複製到從庫。
  • 若函數未顯式聲明,MySQL 拒絕創建,除非放寬檢查:log_bin_trust_function_creators=ON。
  • 參數默認 OFF(0),屬於全局動態變量,需 SET GLOBAL 修改。

修復步驟

  1. 登錄 MySQL:mysql -u root -p
  2. 設置全局變量(立即生效,無需重啟):
    SET GLOBAL log_bin_trust_function_creators = 1;
    
  3. 驗證生效:
    SHOW VARIABLES LIKE 'log_bin_trust_function_creators';
    +---------------------------------+-------+
    | Variable_name                   | Value |
    +---------------------------------+-------+
    | log_bin_trust_function_creators | ON    |
    +---------------------------------+-------+
    
  4. 重新創建函數,應成功。
  5. 持久化:編輯 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 事件。
  • 從庫重放時**同樣需要**該參數為 ON,否則從庫 SQL 線程報錯停止。
  • 建議:主從**同時**設置該參數,或統一採用顯式聲明特性的函數定義。

總結

ERROR 1418 是 Binlog 安全機制觸發的保護。首選方案:在函數定義中顯式聲明 DETERMINISTIC / NO SQL / READS SQL DATA;臨時方案:SET GLOBAL log_bin_trust_function_creators=1 創建後再關閉。主從環境務必保持主從參數一致,避免同步中斷。

copyright © 萬盛學電腦網 all rights reserved