亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在開啟了log-bin的MySQL Server中創建FUNCTION?

如何在開啟了log-bin的MySQL Server中創建FUNCTION?

翻翻過去那場雪 2018-12-13 15:11:10
如何在開啟了log-bin的MySQL Server中創建FUNCTION
查看完整描述

1 回答

?
慕勒3428872

TA貢獻1848條經驗 獲得超6個贊

  在MySQL主從復制機器的master的數據庫中創建function,報出如下錯誤:
  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服務器中開啟了二進制日志選項log-bin,slave會從master復制數據,而一些操作,比如function所得的結果在master和slave上可能不同,所以存在潛在的安全隱患。因此,在默認情況下回阻止function的創建。
  有兩種辦法來解決這一問題
1.將log_bin_trust_function_creators參數設置為ON,這樣一來開啟了log-bin的MySQL Server便可以隨意創建function。這里存在潛在的數據安全問題,除非明確的知道創建的function在master和slave上的行為完全一致。
  設置該參數可以用動態的方式或者指定該參數來啟動數據庫服務器或者修改配置文件后重啟服務器。需注意的是,動態設置的方式會在服務器重啟后失效。
mysql> show variables like 'log_bin_trust_function_creators';
mysql> set global log_bin_trust_function_creators=1;
  另外如果是在master上創建函數,想通過主從復制的方式將函數復制到slave上則也需在開啟了log-bin的slave中設置上述變量的值為ON(變量的設置不會從master復制到slave上,這點需要注意),否則主從復制會報錯。

2.明確指明函數的類型
1 DETERMINISTIC 不確定的
2 NO SQL 沒有SQl語句,當然也不會修改數據
3 READS SQL DATA 只是讀取數據,當然也不會修改數據
  比如:CREATE DEFINER=`username`@`%` READS SQL DATA FUNCTION `fn_getitemclock`(i_itemid bigint,i_clock int,i_pos int) RETURNS int(11)...
這樣一來相當于明確的告知MySQL服務器這個函數不會修改數據,因此可以在開啟了log-bin的服務器上安全的創建并被復制到開啟了log-bin的slave上。

 


查看完整回答
反對 回復 2019-01-10
  • 1 回答
  • 0 關注
  • 712 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號