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

MySQL 啟用 binlog 後創建函數報錯 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)

核心原因

啟用 log_bin 時,MySQL 強制要求函數/觸發器聲明確定性特性,防止主從同步數據不一致。函數僅支援三種聲明:

  • DETERMINISTIC:相同輸入必產生相同輸出
  • NO SQL:不包含 SQL 語句
  • READS SQL DATA:只讀數據,不修改

解決方案一:顯式聲明 (生產環境標準做法)

-- 純計算函數
CREATE FUNCTION hello(s CHAR(20)) 
RETURNS CHAR(50) 
DETERMINISTIC
RETURN CONCAT('hello ', s, '!');

-- 查詢類函數
CREATE FUNCTION get_cid(n CHAR(20)) 
RETURNS INT 
READS SQL DATA
BEGIN
    RETURN (SELECT cid FROM stu WHERE sname = n);
END;

解決方案二:開啟信任模式 (開發/臨時環境)

動態生效 (重啟失效)

SET GLOBAL log_bin_trust_function_creators = 1;

配置文件永久生效

# /etc/my.cnf
[mysqld]
log_bin_trust_function_creators = 1

驗證

SHOW VARIABLES LIKE 'log_bin_trust_function_creators';
-- Value: ON
⚠️ 生產環境嚴禁長期開啟:允許創建不確定性函數 (如包含 UUID()、隨機寫入邏輯),會導致主從數據不一致。僅作為開發調試臨時手段,上線前必須改用方案一。

NOW()/RAND() 特殊說明

官方定義:NOW() 記錄時間戳到 binlog,RAND() 種子同步,兩者在主從重放時行為確定,包含它們的函數仍可聲明 DETERMINISTIC。

總結

ERROR 1418 是 binlog 安全機制的體現。標準流程:分析函數屬性 → 添加 DETERMINISTIC/READS SQL DATA/NO SQL 聲明 → 代碼評審強制檢查。信任模式僅作為開發階段臨時繞過,生產環境零容忍。

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