在其声明和二进制日志logging中启用了DETERMINISTIC,NO SQL或READS SQL DATA

在mysql中导入数据库时​​,出现如下错误:

1418 (HY000) at line 10185: 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)

我不知道我需要改变哪些东西。 任何人都可以帮我解决这个问题吗?

有两种方法可以解决这个问题:

  1. 在MySQL控制台中执行以下操作:

    SET GLOBAL log_bin_trust_function_creators = 1;

  2. 将以下内容添加到mysql.iniconfiguration文件中:

    log_bin_trust_function_creators = 1

该设置放松了对非确定性function的检查。 非确定性函数是修改数据的函数(即具有更新,插入或删除语句)。 欲了解更多信息,请看这里 。

请注意,如果二进制日志logging未启用,则此设置不适用。

http://dev.mysql.com/doc/refman/5.0/en/stored-programs-logging.html

如果未启用二进制日志logging,则log_bin_trust_function_creators不适用。

http://dev.mysql.com/doc/refman/5.0/en/server-system-variables.html#sysvar_log_bin_trust_function_creators

启用二进制日志logging时,此variables适用。

最好的方法是更好地理解和使用存储函数的确定性声明。 MySQL使用这些声明来优化复制,仔细select它们以进行健康复制是一件好事。

确定性如果一个例程对于相同的input参数总是产生相同的结果,则该例程被认为是“确定性的”,否则被认为是“确定性的”。 这主要用于string或math处理,但不限于此。

不确定性与“确定性”相反。 如果在例程定义中既没有定义,也没有定义DETERMINISTIC,那么默认是NOT DETERMINISTIC。要声明一个函数是确定性的,你必须明确指定DETERMINISTIC 。 所以看来,如果没有声明,MySQl将把这个函数当作“NOT DETERMINISTIC”。 手册中的这个陈述与手册中另一个区域的其他陈述相矛盾:“ 当你创build一个存储函数时,你必须声明它是确定性的或者它不修改数据,否则它可能是不安全的数据恢复或复制默认情况下,为了接受CREATE FUNCTION语句,必须至less指定一个DETERMINISTIC,NO SQL或READS SQL DATA,否则会发生错误

如果没有声明,我个人会在MySQL 5.5中出错,所以我总是至less放一个“DETERMINISTIC”,“NOT DETERMINISTIC”,“NO SQL”或“READS SQL DATA”的声明,而不pipe其他声明。

READS SQL DATA这明确告诉MySQL,函数只会从数据库读取数据,因此它不包含修改数据的指令,但是它包含读取数据的SQL指令(eq SELECT)。

MODIFIES SQL DATA这表示例程包含可能写入数据的语句(例如,它包含UPDATE,INSERT,DELETE或ALTER指令)。

NO SQL这表示该例程不包含SQL语句。

CONTAINS SQL这表示该例程包含SQL指令,但不包含读取或写入数据的语句。 如果没有明确给出这些特征,则这是默认值。 这样的语句的例子是SELECT NOW(),SELECT 10 + @ b,SET @x = 1或者DO RELEASE_LOCK('abc'),它们既执行又不读或写数据。

请注意,MySQL函数不是确定性安全的,例如NOW(),UUID()等,它们可能在不同的机器上产生不同的结果,所以包含这些指令的用户函数必须声明为NOT DETERMINISTIC 。 此外,从未复制模式读取数据的函数显然是NONDETERMINISTIC。 *

例程的性质评估基于创build者的“诚实”:MySQL不检查例程声明的DETERMINISTIC是否没有产生非确定性结果的语句。 但是,错误的例行程序可能会影响结果或影响性能。 将一个不确定的例程声明为DETERMINISTIC可能会导致优化器做出不正确的执行计划select,从而导致意外的结果。 将确定性程序声明为NONDETERMINISTIC可能会导致可用的优化不被使用,从而降低性能。

  • 当你创build一个存储函数时,你必须声明它是确定性的或者它不修改数据。 否则,对于数据恢复或复制可能是不安全的。

  • 默认情况下,对于要接受的CREATE FUNCTION语句,必须明确指定DETERMINISTIC,NO SQL或READS SQL DATA中的至less一个。 否则会发生错误:

要解决此问题,请在“Return and Before Begin”语句之后添加以下行:

 READS SQL DATA DETERMINISTIC 

例如 :

 CREATE FUNCTION f2() RETURNS CHAR(36) CHARACTER SET utf8 /*ADD HERE */ READS SQL DATA DETERMINISTIC BEGIN 

有关此问题的更多详细信息,请阅读此处

按照唐纳德的评论:

启用二进制日志logging时,此variables适用。

我所要做的只是:

  1. 禁用my.cnf中的log_bin(#log_bin)
  2. 重启mysql
  3. 导入数据库
  4. 启用log_bin
  5. 重启mysql

那步出那个import问题。

(然后我会回顾一下程序员的代码来提出改进build议)