1. 程式人生 > >MySQL主從複製下log_bin_trust_function_creators的解決

MySQL主從複製下log_bin_trust_function_creators的解決

在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上。