如何在開啟了log-bin的MySQL Server中建立FUNCTION,log-binmysql

來源:互聯網
上載者:User

如何在開啟了log-bin的MySQL Server中建立FUNCTION,log-binmysql

在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上。
mysql 雙向熱備從機沒產生log-bin的問題

在從機上執行show slave status; 看看從機的狀態
 
mysql 的log_bin 總是顯示off

一修改配置後要重啟服務;
二可以指定記錄檔名,查看是否有日誌,例如:
log-bin=bin.log
 

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.