MySQL創建自定義函數時 Error Code: 1418 的解決方法

今天在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)

於是查看 MySQL手冊,錯誤原因如下:

由於基於語句的複製,在從庫重放日誌裏的事件時,使用函數這種非確定性事件可能導致主從數據不一致,因此,開啓二進制日誌功能後,MySQL會對函數的創建做出限制。

解決方法:

首先要知道,在 MySQL中,函數的類別有:
1.CONTAINS SQL 包含了SQL語句(函數默認爲這種類型)
2.READS SQL DATA 只是讀取數據,不修改數據
3.NO SQL 沒有SQL語句(當然也不會修改數據)
4.DETERMINISTIC 確定的
5.MODIFIES SQL DATA 將修改數據

因此如果我們想創建函數,必須指明函數的類別爲 READS SQL DATA 或 NO SQL 或 DETERMINISTIC。

...
CREATE READS SQL DATA FUNCTION ...
...

即告訴 MySQL,我這個函數要麼是確定性的,要麼根本就不會寫數據,因此不會對複製產生影響。

還有一個方法,即將全局參數 log_bin_trust_function_creators 設爲 on,代表受信任的函數創建者,也就是使MySQL不對函數做出限制。注意,如果是在運行過程中修改該值,重啓服務器後,修改就會丟失,因此要手動修改配置文件。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章