在程序開發過程中,大家有沒有遇到過mysql函數不能創建,我是遇到過,是一個很麻煩的問題,上網搜了些相關資料,整理在一起了,供大家參考,幫助那些需要幫助的朋友
在使用MySQL數據庫時,有時會遇到MySQL函數不能創建的情況。下面就教您一個解決MySQL函數不能創建問題的方法,供您借鑒參考。
案例一:
目前在項目中,執行創建mysql的函數出錯,
mysql 創建函數出錯信息如下:
Error Code: 1227. Access denied; you need (at least one of) the SUPER privilege(s) for this operation
首先檢查創建函數的功能是否開啟,檢查是否開啟創建功能的SQL如下:
- -- 查看是否開啟創建函數的功能
- show variables like '%func%';
- -- 開啟創建函數的功能
- set global log_bin_trust_function_creators = 1;
執行完SQL之后發現已經開啟了,隨檢查自己的SQL是否寫錯(因為SQL是別人給的,在別人環境沒問題,在自己的環境就有可能)。
突然發現了確實是SQL出現問題,由于他創建的SQL有指定用戶,所以導致出現問題,以下是他的SQL:
- DROP FUNCTION IF EXISTS `nextval`;
- DELIMITER ;;
- CREATE DEFINER=`devop`@`%` FUNCTION `nextval`(`seq_name` VARCHAR(50)) RETURNS varchar(20) CHARSET utf8
- BEGIN
- DECLARE seq_max BIGINT(20);
- UPDATE sequenceconftable SET `max` = `max` + NEXT WHERE NAME = seq_name;
- SELECT `max` INTO seq_max FROM sequenceconftable WHERE NAME = seq_name ;
- RETURN seq_max;
- END
- ;;
- DELIMITER ;
由于CREATE_FUNCTION規范,可以發現就是DEFINER這個參數是可以指定數據庫用戶的,但是自己的庫卻不是這個用戶,所以導致問題。
目前問題已經解決。
-EOF-
案例二:
在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_trust_function_creators 默認為0,是不允許function的同步的,開啟這個參數,就可以創建成功了。
- mysql> show variables like '%fun%';
- +---------------------------------+-------+
- | Variable_name | Value |
- +---------------------------------+-------+
- | log_bin_trust_function_creators | ON |
- +---------------------------------+-------+
- 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 '%fun%';
- +---------------------------------+-------+
- | Variable_name | Value |
- +---------------------------------+-------+
- | log_bin_trust_function_creators | ON |
- +---------------------------------+-------+
- 1 row in set (0.00 sec)
如果是在有master上開啟了該參數,記得在slave端也要開啟這個參數(salve需要stop后再重新start),否則在master上創建函數會導致replaction中斷。
案例三:
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)
- (0 ms taken)
分析:
根據系統提示,導致該錯誤的原因可能是一個安全設置方面的配置,查手冊log_bin_trust_function_creators參數缺省0,是不允許function的同步的,一般我們在配置repliaction的時候,都忘記關注這個參數,這樣在master更新funtion后,slave就會報告錯誤,然后slave stoped。
處理過程:
登陸mysql數據庫
- > set global log_bin_trust_function_creators = 1;
- > start slave;
跟蹤mysql的啟動日志,slave正常運行,問題解決。
新聞熱點
疑難解答