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

MySQL 創建函數報錯 ERROR 1418 解決方案:log_bin_trust_function_creators 詳解

     編輯:MySQL 資料庫相關知識

在啟用二進制日志(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 不再攔截不確定性函數。

主從複製場景驗證流程

  1. 主庫開啟 log_bin_trust_function_creators=1
  2. 創建函數
  3. 從庫執行 START SLAVE
  4. 監控 SHOW SLAVE STATUS\G 中 Slave_IO_Running=Yes、Slave_SQL_Running=Yes、Seconds_Behind_Master=0
  5. 主庫調用函數寫入,驗證從庫數據一致性

最佳實踐建議

  1. 優先為函數添加 DETERMINISTIC / NO SQL / READS SQL DATA 聲明
  2. 避免在函數中使用非確定性函數:UUID()、RAND()、NOW()、SYSDATE()
  3. 嚴禁在函數中執行寫操作(INSERT/UPDATE/DELETE/DDL)
  4. 主從環境強制要求函數確定性,不建議開啟 log_bin_trust_function_creators
  5. 使用 ROW 格式 Binlog(binlog_format=ROW)降低函數複製風險

理解 ERROR 1418 的複製安全語義,優先通過代碼規範解決,而非單純放寬參數。

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