首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

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

     編輯:MySQL 綜合教學

MySQL 創建存儲函數時遇到 ERROR 1418 (HY000),提示函數缺少 DETERMINISTIC、NO SQL 或 READS SQL DATA 特性聲明,且二進制日誌已啟用。這是 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):相同輸入必然產生相同輸出,安全複製
  • 若函數含隨機、時間、修改數據等不確定行為,複製時主從數據可能不一致
  • 參數 log_bin_trust_function_creators 默認 OFF,禁止創建未聲明特性的函數

解決方案

方法一:聲明函數特性(推薦,最安全)

CREATE FUNCTION my_func(p INT) RETURNS INT
DETERMINISTIC  -- 或 NO SQL / READS SQL DATA
BEGIN
  RETURN p * 2;
END;
  • DETERMINISTIC:無副作用,相同輸入必得相同輸出
  • NO SQL:不包含 SQL 語句
  • READS SQL DATA:只讀數據,不修改
  • MODIFIES SQL DATA:修改數據(複製不安全,需謹慎)

方法二:開啟信任開關(快速解決,生產環境慎用)

-- 會話級(重連失效)
SET GLOBAL log_bin_trust_function_creators = 1;

-- 永久生效:配置文件 my.cnf / my.ini
[mysqld]
log_bin_trust_function_creators = 1

重啟 MySQL 生效。開啟後,創建函數無需聲明特性,但開發者需自行保證函數確定性,否則主從數據可能不一致。

方法三:啟動參數注入

mysqld --log-bin-trust-function-creators=1

驗證

SHOW VARIABLES LIKE 'log_bin_trust_function_creators';
-- Value: ON  表示生效

最佳實踐建議

  1. 優先聲明特性:在 CREATE FUNCTION 中顯式加 DETERMINISTIC 或 READS SQL DATA
  2. 審核函數邏輯:確保無 RAND()、NOW()、UUID() 等非確定性調用
  3. 主從環境謹慎開啟信任開關:若必須開啟,建立代碼審查機制
  4. 文檔化:在函數註釋說明確定性依據

相關參數速查

參數作用域默認值建議
log_bin_trust_function_creatorsGLOBALOFF函數聲明特性後可保持 OFF
log_binGLOBALOFF主庫必須 ON
binlog_formatGLOBAL/SESSIONROW推薦 ROW 格式

總結

ERROR 1418 是 MySQL 為複製安全設置的守門規則。正規做法是聲明函數特性,臨時可開啟 log_bin_trust_function_creators=1。建立「聲明特性→代碼審查→測試驗證」流程,兼顧開發效率與數據一致性。

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