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

開啟 binlog 後創建存儲函數報錯: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:只讀數據,不修改。
  • MODIFIES SQL DATA:修改數據(不允許)。
  • CONTAINS SQL:包含 SQL(不允許)。

若不想逐個函數加聲明,可開啟全域信任開關。

解決方案

臨時生效(重啟失效)


SET GLOBAL log_bin_trust_function_creators = 1;

永久生效(配置檔)


# my.cnf / my.ini [mysqld]
log_bin_trust_function_creators = 1
# 重啟生效
systemctl restart mysqld

驗證


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

最佳實踐:聲明確定性而非開啟開關


CREATE FUNCTION fn_example(p INT) RETURNS INT
DETERMINISTIC
NO SQL
BEGIN
  RETURN p * 2;
END;
  • 生產環境建議逐個函數加 DETERMINISTIC / READS SQL DATA,保證主從語義一致。
  • 僅在測試/遷移臨時階段開啟 log_bin_trust_function_creators=1,上線前改回 0 並補全聲明。

相關變數

變數作用
log_bin_trust_function_creators信任創建者不檢查確定性
log_bin_trust_routine_creators同理,針對存儲過程

一行配置或一個關鍵字,解決 binlog 環境下函數創建阻塞。

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