MYSQL 創(chuàng)建函數(shù)出錯(cuò)的解決方案
在使用MySQL數(shù)據(jù)庫(kù)時(shí),有時(shí)會(huì)遇到MySQL函數(shù)不能創(chuàng)建的情況。下面就教您一個(gè)解決MySQL函數(shù)不能創(chuàng)建問(wèn)題的方法,供您借鑒參考。
案例一:
目前在項(xiàng)目中,執(zhí)行創(chuàng)建mysql的函數(shù)出錯(cuò),
mysql 創(chuàng)建函數(shù)出錯(cuò)信息如下:
Error Code: 1227. Access denied; you need (at least one of) the SUPER privilege(s) for this operation
首先檢查創(chuàng)建函數(shù)的功能是否開(kāi)啟,檢查是否開(kāi)啟創(chuàng)建功能的SQL如下:
-- 查看是否開(kāi)啟創(chuàng)建函數(shù)的功能 show variables like '%func%'; -- 開(kāi)啟創(chuàng)建函數(shù)的功能 set global log_bin_trust_function_creators = 1;
執(zhí)行完SQL之后發(fā)現(xiàn)已經(jīng)開(kāi)啟了,隨檢查自己的SQL是否寫(xiě)錯(cuò)(因?yàn)镾QL是別人給的,在別人環(huán)境沒(méi)問(wèn)題,在自己的環(huán)境就有可能)。
突然發(fā)現(xiàn)了確實(shí)是SQL出現(xiàn)問(wèn)題,由于他創(chuàng)建的SQL有指定用戶(hù),所以導(dǎo)致出現(xiàn)問(wèn)題,以下是他的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規(guī)范,可以發(fā)現(xiàn)就是DEFINER這個(gè)參數(shù)是可以指定數(shù)據(jù)庫(kù)用戶(hù)的,但是自己的庫(kù)卻不是這個(gè)用戶(hù),所以導(dǎo)致問(wèn)題。
目前問(wèn)題已經(jīng)解決。
-EOF-
案例二:
在MySQL創(chuàng)建用戶(hù)自定義函數(shù)時(shí),報(bào)以下錯(cuò)誤:
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)
這是因?yàn)橛幸粋€(gè)安全參數(shù)沒(méi)有開(kāi)啟,log_bin_trust_function_creators 默認(rèn)為0,是不允許function的同步的,開(kāi)啟這個(gè)參數(shù),就可以創(chuàng)建成功了。
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上開(kāi)啟了該參數(shù),記得在slave端也要開(kāi)啟這個(gè)參數(shù)(salve需要stop后再重新start),否則在master上創(chuàng)建函數(shù)會(huì)導(dǎo)致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)
分析:
根據(jù)系統(tǒng)提示,導(dǎo)致該錯(cuò)誤的原因可能是一個(gè)安全設(shè)置方面的配置,查手冊(cè)log_bin_trust_function_creators參數(shù)缺省0,是不允許function的同步的,一般我們?cè)谂渲胷epliaction的時(shí)候,都忘記關(guān)注這個(gè)參數(shù),這樣在master更新funtion后,slave就會(huì)報(bào)告錯(cuò)誤,然后slave stoped。
處理過(guò)程:
登陸mysql數(shù)據(jù)庫(kù)
> set global log_bin_trust_function_creators = 1; > start slave;
跟蹤mysql的啟動(dòng)日志,slave正常運(yùn)行,問(wèn)題解決。
相關(guān)文章
解決MySql8.0 查看事務(wù)隔離級(jí)別報(bào)錯(cuò)的問(wèn)題
這篇文章主要介紹了解決MySql8.0 查看事務(wù)隔離級(jí)別報(bào)錯(cuò)的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10
在同一Linux下安裝兩個(gè)版本的MySQL的流程步驟
打工人奉旨制作數(shù)據(jù)庫(kù)服務(wù)的虛擬機(jī)模板,模板中包含各種數(shù)據(jù)庫(kù),其中mysql需要具備5.7及8.0兩個(gè)版本,并保證服務(wù)能正常同時(shí)使用,所以本文給小編介紹了在同一Linux下安裝兩個(gè)版本的MySQL的流程步驟,需要的朋友可以參考下2024-03-03
MySQL中索引優(yōu)化distinct語(yǔ)句及distinct的多字段操作
這篇文章主要介紹了MySQL中索引優(yōu)化distinct語(yǔ)句及distinct的多字段操作方法,distinct語(yǔ)句去重功能的使用是MySQL入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2016-01-01
Mysql怎么存儲(chǔ)json格式數(shù)據(jù)詳解
在開(kāi)發(fā)中遇到存取html值的情況,并且要根據(jù)id進(jìn)行實(shí)時(shí)返回,在做的時(shí)候想到了mysql的json類(lèi)型存儲(chǔ),下面這篇文章主要給大家介紹了關(guān)于Mysql怎么存儲(chǔ)json格式數(shù)據(jù)的相關(guān)資料,需要的朋友可以參考下2022-06-06

