MySQL开启bin_log后导致创建函数、存储过程失败。Error:Result_ 1418 - This function has none of DETERMINISTIC

现在搭建主从数据库,需要使用MySQL的binlog去同步数据,但是开启binlog后导致新增函数、存储过程等报错。

完整的报错信息:

Result: 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开启bin-log后,调用存储过程或者函数以及触发器是就会出现1418错误,此时需要修改global log_bin_trust_function_creators,它控制是否可以信任存储函数创建者,不会创建写入二进制日志引起不安全事件的存储函数。如果设置为0(默认值),用户不得创建或修改存储函数,除非它们具有除CREATE ROUTINE或ALTER ROUTINE特权之外的SUPER权限。 设置为0还强制使用DETERMINISTIC特性或READS SQL DATA或NO SQL特性声明函数的限制。 如果变量设置为1,MySQL不会对创建存储函数实施这些限制。 此变量也适用于触发器的创建。
解决方式

  1. 临时修改,但是在mysql服务重启后失效,直接在客户端执行命令
set global log_bin_trust_function_creators=1;
  1. MySQL启动时,加上–log-bin-trust-function-creators=1 (未测试)
  2. 修改my.ini 或者my.cnf文件,永久有效

Linux中修改my.conf

vim /etc/my.cnf 这是默认安装位置
在[mysqld]中添加 log_bin_trust_function_creators=1

image.png
windows在my.ini文件中(你的mysql安装位置)

# 开启bin-log后可以调用函数
log_bin_trust_function_creators=1

image.png

开启bin-log方法,参考文章 https://www.cnblogs.com/handle/p/9761702.html

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这个错误是因为MySQL开启了二进制日志记录(binary logging),并且函数存储过程的声明中没有指定DETERMINISTIC、NO SQL或READS SQL DATA属性。 要解决这个问题,有以下两个方法: 方法一:使用log_bin_trust_function_creators变量 由于这个错误是因为MySQL开启了二进制日志记录,可以通过修改log_bin_trust_function_creators变量来解决这个问题。 1. 登录到MySQL客户端。 2. 运行以下命令: ``` SET GLOBAL log_bin_trust_function_creators = 1; ``` 这将允许创建没有DETERMINISTIC、NO SQL或READS SQL DATA属性的函数存储过程,并将它们记录到二进制日志中。 3. 重新创建函数存储过程。 方法二:指定DETERMINISTIC、NO SQL或READS SQL DATA属性 如果您不想修改log_bin_trust_function_creators变量,可以通过在函数存储过程的声明中指定DETERMINISTIC、NO SQL或READS SQL DATA属性来解决这个问题。 1. 在创建函数存储过程的声明中,添加以下属性之一: - DETERMINISTIC:如果函数存储过程返回相同的结果,则指定函数存储过程是确定性的。 - NO SQL:指定函数存储过程不会修改数据库中的数据。 - READS SQL DATA:指定函数存储过程只会读取数据库中的数据。 例如,以下是一个创建函数并指定DETERMINISTIC属性的示例: ``` CREATE FUNCTION my_function_name (param1 INT, param2 VARCHAR(50)) RETURNS INT DETERMINISTIC BEGIN -- function body END; ``` 2. 重新创建函数存储过程。 这样,函数存储过程就会被正确创建,并且可以记录到二进制日志中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值