错误描述
今天启用了MySQL二进制日志,然后再使用MySQL创建函数,运行语句进行创建时总是报如下错误:
[Err] 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后,在进行主从复制必须要知道这个函数的类型才能同步数据,因此在声明函数时我们必须指定我们的函数的类型,MySQL支持的参数类型有以下五种:
1. DETERMINISTIC 不确定的
2. NO SQL 没有SQl语句,当然也不会修改数据
3. READS SQL DATA 只是读取数据,当然也不会修改数据
4. MODIFIES SQL DATA 要修改数据
5. CONTAINS SQL 包含了SQL语句
方案二
将log_bin_trust_function_creators 设置为1,启动MySQL运行下面命令:
set GLOBAL log_bin_trust_function_creators=1;
因为二进制日志的一个重要功能是用于主从复制,而存储函数有可能导致主从的数据不一致。所以当开启二进制日志后,参数log_bin_trust_function_creators就会生效,限制存储函数的创建、修改、调用。因此,设置这个参数就相当于明确告知MySQL服务器这个函数不会修改数据,这样就能顺利进行函数的创建。
默认 log_bin_trust_function_creators=0,处于关闭状态
设置 log_bin_trust_function_creators=1,处于开启状态
设置好之后就可以直接创建函数了