在MySQL主從複製機器的master的數據庫中建立function,報出以下錯誤:mysql
Error Code: 1418. 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)sql
原來是由於在主從複製的兩臺MySQL服務器中開啓了二進制日誌選項log-bin,slave會從master複製數據,而一些操做,好比function所得的結果在master和slave上可能不一樣,因此存在潛在的安全隱患。所以,在默認狀況下回阻止function的建立。數據庫
有兩種辦法來解決這一問題。安全
方法一:
將log_bin_trust_function_creators參數設置爲ON,這樣以來開啓了log-bin的MySQL Server即可以隨意建立function。這裏存在潛在的數據安全問題,除非明確的知道建立的function在master和slave上的行爲徹底一致。服務器
設置該參數能夠用動態的方式或者指定該參數來啓動數據庫服務器或者修改配置文件後重啓服務器。需注意的是,動態設置的方式會在服務器重啓後失效,命令以下:
less
mysql> show variables like 'log_bin_trust_function_creators'; mysql> set global log_bin_trust_function_creators=1;
另外,若是是在master上建立函數,想經過主從複製的方式將函數複製到slave上則也需在開啓了log-bin的slave中設置上述變量的值爲ON(變量的設置不會從master複製到slave上,這點須要注意),不然主從複製會報錯。函數
方法二:spa
明確指明函數的類型。
1 DETERMINISTIC 不肯定的
2 NO SQL 沒有SQl語句,固然也不會修改數據
3 READS SQL DATA 只是讀取數據,固然也不會修改數據
好比:CREATE DEFINER=`username`@`%` READS SQL DATA FUNCTION `fn_getitemclock`(i_itemid bigint,i_clock int,i_pos int) RETURNS int(11)...
如此至關於明確的告知MySQL服務器這個函數不會修改數據,所以能夠在開啓了log-bin的服務器上安全的建立並被複制到開啓了log-bin的slave上。日誌
(該文從新排版於 2018-11-27 13:34:12)code