MySQL創建自定義函數

MySQL中創建function的時候出現了"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)"的錯誤信息。如下圖所示:


出現這個錯誤的原因是:

我們開啓了bin-log日誌(與MySQL的主從複製有關),slave會從master複製數據,而一些操作,比如function所得的結構在master和slave上的可能不同,所以存在潛在的安全隱患。因此默認情況下會組織function的創建。

解決這個問題有兩種辦法:

1、將Mysql Server的“log_bin_trust_function_creators”參數設置爲ON,這樣一來開啓了log-bin的MySQL Server便可以隨意創建function。這裏存在潛在的數據安全問題,除非明確的知道創建function在master和slave上的行爲完全一致。

我們可以通過命令行來設置該參數,如下所示

mysql> show variables like 'log_bin_trust_function_creators';
+---------------------------------+-------+
| Variable_name                   | Value |
+---------------------------------+-------+
| log_bin_trust_function_creators | OFF   |
+---------------------------------+-------+
1 row in set (0.00 sec)

mysql> set global log_bin_trust_function_creators=1;
Query OK, 0 rows affected (0.00 sec)


mysql> show variables like 'log_bin_trust_function_creators';
+---------------------------------+-------+
| Variable_name                   | Value |
+---------------------------------+-------+
| log_bin_trust_function_creators | ON    |
+---------------------------------+-------+
1 row in set (0.00 sec)

注:這種方式重啓MySQL服務後設置就會失效,如果想要永久生效,需要在MySQL的配置文件中顯示配置。另外,如果再mster上創建函數,想通過主從複製的方式將函數複製到slsave上則也需在開啓了log-bin的slave中設置上述變量爲ON(變量的設置不會從master複製到slave上,這點需要注意),否則主從複製會報錯。

2、明確指定我們的函數類型

1)、DETERMINISTIC    不確定的

2)、NO SQL    沒有sql語句,不會修改數據

3)、READS SQL DATA    只是讀取數據,當然也不會修改數據

這樣一來相當於明確的告知MySQL Server這個函數不會修改數據,因此可以在開啓了log-bin的服務器上安全的創建並被複制到開啓了log-bin的salve上。

發佈了142 篇原創文章 · 獲贊 29 · 訪問量 27萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章