MySQL创建自定义函数时 Error Code: 1418 的解决方法

今天在MySQL中创建函数时,报了以下错误:
Error Code: 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手册,错误原因如下:

由于基于语句的复制,在从库重放日志里的事件时,使用函数这种非确定性事件可能导致主从数据不一致,因此,开启二进制日志功能后,MySQL会对函数的创建做出限制。

解决方法:

首先要知道,在 MySQL中,函数的类别有:
1.CONTAINS SQL 包含了SQL语句(函数默认为这种类型)
2.READS SQL DATA 只是读取数据,不修改数据
3.NO SQL 没有SQL语句(当然也不会修改数据)
4.DETERMINISTIC 确定的
5.MODIFIES SQL DATA 将修改数据

因此如果我们想创建函数,必须指明函数的类别为 READS SQL DATA 或 NO SQL 或 DETERMINISTIC。

...
CREATE READS SQL DATA FUNCTION ...
...

即告诉 MySQL,我这个函数要么是确定性的,要么根本就不会写数据,因此不会对复制产生影响。

还有一个方法,即将全局参数 log_bin_trust_function_creators 设为 on,代表受信任的函数创建者,也就是使MySQL不对函数做出限制。注意,如果是在运行过程中修改该值,重启服务器后,修改就会丢失,因此要手动修改配置文件。

你可能感兴趣的:(MySQL)