1 回答

TA貢獻(xiàn)1848條經(jīng)驗(yàn) 獲得超6個(gè)贊
在MySQL主從復(fù)制機(jī)器的master的數(shù)據(jù)庫中創(chuàng)建function,報(bào)出如下錯(cuò)誤:
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)
原來是因?yàn)樵谥鲝膹?fù)制的兩臺(tái)MySQL服務(wù)器中開啟了二進(jìn)制日志選項(xiàng)log-bin,slave會(huì)從master復(fù)制數(shù)據(jù),而一些操作,比如function所得的結(jié)果在master和slave上可能不同,所以存在潛在的安全隱患。因此,在默認(rèn)情況下回阻止function的創(chuàng)建。
有兩種辦法來解決這一問題
1.將log_bin_trust_function_creators參數(shù)設(shè)置為ON,這樣一來開啟了log-bin的MySQL Server便可以隨意創(chuàng)建function。這里存在潛在的數(shù)據(jù)安全問題,除非明確的知道創(chuàng)建的function在master和slave上的行為完全一致。
設(shè)置該參數(shù)可以用動(dòng)態(tài)的方式或者指定該參數(shù)來啟動(dòng)數(shù)據(jù)庫服務(wù)器或者修改配置文件后重啟服務(wù)器。需注意的是,動(dòng)態(tài)設(shè)置的方式會(huì)在服務(wù)器重啟后失效。
mysql> show variables like 'log_bin_trust_function_creators';
mysql> set global log_bin_trust_function_creators=1;
另外如果是在master上創(chuàng)建函數(shù),想通過主從復(fù)制的方式將函數(shù)復(fù)制到slave上則也需在開啟了log-bin的slave中設(shè)置上述變量的值為ON(變量的設(shè)置不會(huì)從master復(fù)制到slave上,這點(diǎn)需要注意),否則主從復(fù)制會(huì)報(bào)錯(cuò)。
2.明確指明函數(shù)的類型
1 DETERMINISTIC 不確定的
2 NO SQL 沒有SQl語句,當(dāng)然也不會(huì)修改數(shù)據(jù)
3 READS SQL DATA 只是讀取數(shù)據(jù),當(dāng)然也不會(huì)修改數(shù)據(jù)
比如:CREATE DEFINER=`username`@`%` READS SQL DATA FUNCTION `fn_getitemclock`(i_itemid bigint,i_clock int,i_pos int) RETURNS int(11)...
這樣一來相當(dāng)于明確的告知MySQL服務(wù)器這個(gè)函數(shù)不會(huì)修改數(shù)據(jù),因此可以在開啟了log-bin的服務(wù)器上安全的創(chuàng)建并被復(fù)制到開啟了log-bin的slave上。
添加回答
舉報(bào)