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 環境下函數創建阻塞。