64.MySQL-Error ‘Unknown error 1418‘‘ on query

文章描述了一个在MySQL主从复制过程中遇到的错误,具体是由于创建非确定性存储过程或函数导致的数据不一致问题。解决方法包括在客户端设置全局变量`log_bin_trust_function_creators`为1,或者在MySQL启动参数和配置文件中添加相应设置,允许非确定性函数在二进制日志中记录。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.主从复制时报错。

Worker 8 failed executing transaction '6b3376bc-8d60-11ed-b1cf-00505699f49f:68966' at master log mybinlog.000009, 
end_log_pos 92870206; Error 'Unknown error 1418'' on query. 
Default database: 'pub_sys'. 
Query: 'CREATE DEFINER=`root`@`%` FUNCTION `FUNC_NEXTID`(`I_TABLENAME` varchar(60)) RETURNS bigint(12)
BEGIN
    DECLARE NEXTID BIGINT(12);
    DECLARE TABLENAME VARCHAR(60);
    SET TABLENAME=I_TABLENAME;
    SET NEXTID=12;
       SELECT IFNULL(MAX(ID),-1)
          INTO NEXTID
          FROM t_sequence
         WHERE UPPER(NAME) = UPPER(TABLENAME);
    IF NEXTID = -1 THEN
        INSERT INTO t_sequence (NAME, ID) VALUES (TABLENAME, 1);
        SET NEXTID= 1;
    ELSE
        #v1.0.2 update之后本记录处于锁定状态,这样并发时也不会出现相同ID
        UPDATE t_sequence SET ID = ID + 1 WHERE UPPER(NAME) = UPPER(TABLENAME);
        SELECT IFNULL(MAX(ID),-1)
          INTO NEXTID
          FROM t_sequence
         WHERE UPPER(NAME) = UPPER(TABLENAME);
    END IF;
    RETURN (N);

2.原因

在MySQL中,存储过程或者函数必须显示声明是:确定性(DETERMINISTIC)的还是不可改变的(NOT DETERMINISTIC)。如果在主从服务器都执行相关的存储过程或者函数,将导致数据不一致。

3.解决方法。

1.在客户端上执行

SET GLOBAL log_bin_trust_function_creators = 1;
2.MySQL启动时,加上--log-bin-trust-function-creators选贤,参数设置为1
3.在MySQL配置文件

my.ini或my.cnf中的

[mysqld]

log-bin-trust-function-creators=1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值