故障分析--主从复制故障1
生活随笔
收集整理的這篇文章主要介紹了
故障分析--主从复制故障1
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
報錯內容
2016-04-29 00:09:57 9242 [ERROR] Slave SQL: Error '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)' on query. Default database: 'epsp_db'. Query: 'CREATE DEFINER=`unionpayb2b`@`%` FUNCTION `currval`(v_seq_name VARCHAR(50)) RETURNS int(11) BEGIN DECLARE val,val1 INTEGER; SET val = 0; SELECT current_val INTO val1 FROM tbl_sequence WHERE seq_name = v_seq_name; IF (val1 IS NULL)THENINSERT INTO tbl_sequence VALUES(v_seq_name,0,1);ELSESET val=val1;END IF;RETURN val; END', Error_code: 1418 2016-04-29 00:09:57 9242 [Warning] Slave: 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) Error_code: 1418 2016-04-29 00:09:57 9242 [Warning] Slave: Failed to CREATE FUNCTION currval Error_code: 1307 2016-04-29 00:09:57 9242 [ERROR] Error running query, slave SQL thread aborted. Fix the problem, and restart the slave SQL thread with "SLAVE START". We stopped at log 'mysql-bin.000002' position 326441 2016-04-29 00:10:01 9242 [Note] /data/mysql/base/bin/mysqld: Normal shutdown?
錯誤分析1
根據錯誤信息得知由于創建的這個函數對數據的操作對于replication場景,存在不確定性,也就是說這個函數在主庫和從庫上執行可能產生不一樣的結果。 所以該函數在從庫應用時產生了錯誤,并導致從庫sql apply中斷,錯誤信息中也記錄了中斷的文件及對應的position點?
錯誤分析2
根據錯誤信息給出的提示,可能需要設置log_bin_trust_function_creators這個變量來解決這個錯誤 通過查詢官方文檔,得知了該參數的含義:log_bin_trust_function_creators這是一個安全參數,針對于主從復制時對于函數和觸發器的處理,默認值為0,表示不允許對數據操作存在不確定性的函數和觸發器的創建,因為這類語句會導致主從數據不一致的情況發生。同時官方文檔對這類語句產生不一致的場景進行了進一步說明:通常二進制日志設置為statement或mixed格式時會出現這種情況,如果是row格式則不會,因為row格式不是記錄的對這個函數的調用語句,而是記錄的函數調用后對行的改變的記錄。同樣對于觸發器也是一樣。所以在基于row格式的情況下不會發生這種不一致的情況。mixed格式雖然會根據不同的情況動態的使用statement或row格式,但對于函數和觸發器,mixed總是使用statement方式進行記錄,所以基于mixed格式也會存在這種問題。官方鏈接說明:https://dev.mysql.com/doc/refman/5.7/en/stored-programs-logging.html?
解決辦法
[master/slave]修改二進制日志格式為row格式SHOW VARIABLES LIKE 'BIN%';
SET GLOBAL BINLOG_FORMAT=ROW
SET SESSION BINLOG_FORMAT=ROW
#vi /etc/my.cnf
##add
binlog_format = 1[master/slave]修改log_bin_trust_function_creators參數,將其設置為1
SHOW VARIABLES LIKE 'LOG_BIN_TRUST_FUNCTION_CREATORS';SET GLOBAL log_bin_trust_function_creators = 1;
提前啟用該參數,避免主從復制時函數或觸發器導致從庫復制中斷的問題,
但由于該參數開啟后,如果不是基于row格式的復制,很難保證當執行相關自定義的函數時,對數據的操作在主從上是一致的,存在不確定性,這也是為什么MySQL默認是
禁止這類函數和觸發器的原因,目的是為了保持主從數據的一致性。所以建議可能的情況下,還是采用基于row格式的復制,并開啟該參數,避免產生相關錯誤。
同時也要關注不同的日志格式的區別及對性能的影響。
?
轉載于:https://www.cnblogs.com/zhenxing/p/5460062.html
總結
以上是生活随笔為你收集整理的故障分析--主从复制故障1的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JSONEasy的用法(JSONDate
- 下一篇: 如何禁用笔记本键盘