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

ASR*_*ASR 80 mysql

在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)

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

Don*_*nal 179

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

  1. 在MySQL控制台中执行以下命令:

    SET GLOBAL log_bin_trust_function_creators = 1;

  2. 将以下内容添加到mysql.ini配置文件中:

    log_bin_trust_function_creators = 1;

该设置放松了对非确定性功能的检查.非确定性函数是修改数据的函数(即具有更新,插入或删除语句).有关详细信息,请参阅此处.

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

存储程序的二进制日志记录

如果未启用二进制日志记录,则log_bin_trust_function_creators不适用.

log_bin_trust_function_creators

启用二进制日志记录时,此变量适用.

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

确定性 如果例程对于相同的输入参数总是产生相同的结果而不是确定性,则该例程被认为是"确定性的".这主要用于字符串或数学处理,但不限于此.

没有决定性 的"决定性"." 如果在例程定义中没有给出DETERMINISTIC或NOT DETERMINISTIC,则默认值为NOT DETERMINISTIC.要声明函数是确定性的,必须明确指定DETERMINISTIC. ".所以似乎如果没有声明,MySQl会将该函数视为"NOT DETERMINISTIC".手册中的这个陈述与另一个手册领域的其他陈述相矛盾,该陈述告诉我们:" 当你创建一个存储函数时,你必须声明它是确定性的或者它不会修改数据.否则,它可能是不安全的.数据恢复或复制.默认情况下,要接受CREATE FUNCTION语句,必须至少明确指定DETERMINISTIC,NO SQL或READS SQL DATA中的一个.否则会发生错误 "

我个人在MySQL 5.5中遇到错误,如果没有声明,所以我总是至少提出一个"DETERMINISTIC","NOT DETERMINISTIC","NO SQL"或"READS SQL DATA"的声明,无论我可能有其他声明.

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'),它们既不执行读也不执行写数据.

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

对例程性质的评估基于创建者的"诚实":MySQL不会检查声明为DETERMINISTIC的例程是否没有产生非确定性结果的语句.但是,错误地说明例程可能会影响结果或影响性能.将非确定性例程声明为DETERMINISTIC可能会导致优化程序选择错误的执行计划,从而导致意外结果.将确定性例程声明为NONDETERMINISTIC可能会导致不使用可用的优化,从而降低性能.

  • 我怀疑数据库具有修改数据的功能(其中具有更新,插入或删除语句)。有关更多信息,请参见此处:http://dev.mysql.com/doc/refman/5.0/en/stored-programs-logging.html (2认同)

Sun*_*S.M 33

  • 创建存储函数时,必须声明它是确定性的或不修改数据.否则,数据恢复或复制可能不安全.

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

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

READS SQL DATA
DETERMINISTIC
Run Code Online (Sandbox Code Playgroud)

例如 :

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

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


小智 25

我在 ubuntu 上使用这个命令:

mysql -u root -p
Run Code Online (Sandbox Code Playgroud)

并输入mysql server error并在mysql中执行以下命令:

SET GLOBAL log_bin_trust_function_creators = 1;
Run Code Online (Sandbox Code Playgroud)


Par*_*Bum 7

当您的函数是确定性的时,您可以安全地将其声明为确定性的。“DETERMINISTIC”关键字的位置如下。

在此处输入图片说明


小智 5

遵循唐纳德的评论:

当启用二进制日志记录时,此变量适用。

我所要做的就是:

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

那一步解决了导入问题。

(然后我会查看程序员的代码以提出改进建议)