本文共 1091 字,大约阅读时间需要 3 分钟。
查看日志信息:show variables like 'log_%';显示'log_bin'、'log_bin_trust_function_creators'等状态
解决方案:
关闭binary logging
在创建函数 begin 之前加上 DETERMINISTIC READS SQL DATA
设置global系统变量为1
参考:
创建或修改存储函数时,通常需要特定的权限。此外,根据函数定义中的DEFINER值,可能需要满足额外条件。
当创建存储函数时,您必须声明其是确定性的或不修改数据,否则可能存在数据恢复或复制的安全隐患。默认情况下,若不指定DETERMINISTIC、NO SQL或READS SQL DATA中的至少一个,且binary logging已启用,可能会出现以下错误:
ERROR 1418 (HY000): 这个函数没有DETERMINISTIC、NO SQL或READS SQL DATA中的任何声明,而binary logging已启用(您可能想使用较不安全的log_bin_trust_function_creators变量)。
以下示例说明:
CREATE FUNCTION f1(i INT) RETURNS INT DETERMINISTIC READS SQL DATABEGINRETURN i;END;
CREATE FUNCTION f2() RETURNS CHAR(36) CHARACTER SET utf8BEGINRETURN UUID();END;
CREATE FUNCTION f3(p_id INT) RETURNS INTBEGINUPDATE t SET modtime = NOW() WHERE id = p_id;RETURN ROW_COUNT();END;
请注意,MySQL不检查声明为DETERMINISTIC的函数是否真的确定性。
要放宽函数创建的条件(除非binary logging已启用),设置global系统变量为1:
mysql> SET GLOBAL log_bin_trust_function_creators = 1;
您也可以在启动服务器时设置此变量。若binary logging未启用,则不需要设置此变量,除非函数定义中的DEFINER值要求。
如需了解可能危害复制的内置函数,请参阅相关文档。
转载地址:http://kzbfk.baihongyu.com/