mysql 从库报错1418分析处理–生产案例
某天管理员反应某系统主从报错如下:
Last_Errno: 1418
Last_Error: Worker 1 failed executing transaction ‘c87541e5-d534-11e9-fc56-f85990571ecd:94190xxx’ at master log mysql-bin.000078, end_log_pos 1019424988.
ERROR 1418 (HY000): 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)
Query: ‘CREATE DEFINER=xxxxxxuser
@%
FUNCTION currVal
(seq_name VARCHAR(50)) RETURNS bigint(20)
BEGIN
DECLARE value BIGINT;
SELECT current_vlaue INTO value
FROM f_wase_base_sequence
WHRER upper(name) = upper(seq_name);
RETURNS value;
END’,Error 1418
确认主从相关变量设置:
查看报错是主库有创建不确定函数,
主库设置了 log_bin_trust_function_creators =on;
从库设置了 log_bin_trust_function_creators =off;
因主从相关此变量设置不一样导致复制中断。
内在原因:
二进制日志包含有关修改数据库内容的SQL语句的信息,该信息以描述修改的“ 事件 ”的形式存储。二进制日志有两个重要目的分别是主从复制和备份恢复。
但是注意存储程序(存储过程和函数,触发器和事件)有关的某些二进制日志记录问题:
在某些情况下,一条语句可能会影响主库和从库上不同的行集。如果修改数据的存储程序是不确定的,则它是不可重复的。这可能导致主库和从库的数据不同,或导致还原的数据与原始数据不同。
在MySQL中创建存储函数时,必须声明它是确定性的或未修改数据。否则,对于数据恢复或复制可能是不安全的。默认情况下,一个CREATE FUNCTION语句被创建,至少明确指定DETERMINISTIC,NO SQL或READS SQL DATA其中一项,否则会发生1418错误。
后续处理:
经过和项目组沟通,项目组确认后续不使用此函数,主库删除此函数并且设置log_bin_trust_function_creators=off,并修复主从。相关mysql开发规范也是不建议或者禁止使用函数。