首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 函數創建報錯 ERROR 1418:log_bin_trust_function_creators 開啟與關閉

     編輯: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)

根本原因

啟用 Binlog (log_bin=ON) 時,MySQL 要求創建的函數/觸發器/事件必須聲明確定性特徵,以確保主從複寫一致性:

  • DETERMINISTIC:相同輸入必然產生相同輸出
  • NO SQL:不包含 SQL 語句
  • READS SQL DATA:僅讀取資料不修改
  • MODIFIES SQL DATA:修改資料(預設,不允許)

未聲明時預視為 MODIFIES SQL DATA,為安全起見禁止創建。

解決方案

方案一:全域開啟信任變數(快速、風險較低)


SET GLOBAL log_bin_trust_function_creators = 1;
-- 永久生效寫入 my.cnf
[mysqld]
log_bin_trust_function_creators = 1

允許創建未聲明特徵的函數,由開發者自行保證確定性。主從環境若函數非確定性會導致資料不一致。

方案二:正確聲明函數特徵(標準、安全)


CREATE FUNCTION my_func(p INT) RETURNS INT
DETERMINISTIC
NO SQL
RETURN p * 2;
  • 純計算函數:DETERMINISTIC NO SQL 或 DETERMINISTIC READS SQL DATA
  • 讀表函數:DETERMINISTIC READS SQL DATA
  • 修改表函數:不建議,改用存儲過程

方案三:Session 級臨時開啟(最小影響)


SET SESSION log_bin_trust_function_creators = 1;
CREATE FUNCTION ...;
SET SESSION log_bin_trust_function_creators = 0;

查看當前狀態


SHOW VARIABLES LIKE 'log_bin_trust_function_creators';
+---------------------------------+-------+
| Variable_name                   | Value |
+---------------------------------+-------+
| log_bin_trust_function_creators | ON    |
+---------------------------------+-------+

關閉函數功能


SET GLOBAL log_bin_trust_function_creators = 0;

最佳實踐建議

  • 新專案:預設開啟 log_bin_trust_function_creators=1,代碼審查時強制要求聲明 DETERMINISTIC 等特徵
  • 嚴格主從環境:不開啟,強制所有函數聲明確定性
  • 遷移腳本:臨時 SET SESSION ... = 1 導入,完成後關閉
  • 監控:定期檢查 SHOW CREATE FUNCTION 確認特徵聲明完整

小結

ERROR 1418 是 Binlog 安全機制。SET GLOBAL log_bin_trust_function_creators=1 秒解,但最佳實踐是正確聲明 DETERMINISTIC/NO SQL/READS SQL DATA。主從一致性由開發者守護,MySQL 僅提供護欄。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved