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

时间:2014-09-24 10:57:44

标签: 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)

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

7 个答案:

答案 0 :(得分:150)

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

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

    SET GLOBAL log_bin_trust_function_creators = 1;

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

    log_bin_trust_function_creators = 1;

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

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

    Binary Logging of Stored Programs

      

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

    log_bin_trust_function_creators

      

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

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

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

    NOT DETERMINISTIC 与'#34;决定论&#34;相反。 &#34; 如果在例程定义中既未给出DETERMINISTIC也未给出DETERMINISTIC,则默认值为NOT DETERMINISTIC。要声明函数是确定性的,必须明确指定DETERMINISTIC。&#34;。 因此,似乎如果没有声明,MySQl会将该功能视为&#34; NOT DETERMINISTIC&#34;。 本手册中的陈述与其他手册领域的其他陈述相矛盾,该陈述表明: &#34; 创建存储函数时,必须声明它是确定性的或不修改数据。否则,数据恢复或复制可能不安全。 默认情况下,要接受CREATE FUNCTION语句,必须至少明确指定DETERMINISTIC,NO SQL或READS SQL DATA中的一个。否则会发生错误&#34;

    我个人在MySQL 5.5中遇到错误,如果没有声明,所以我总是至少提出一个声明&#34; DETERMINISTIC&#34;,&#34; NOT DETERMINISTIC&#34;,&#34; NO SQL& #34;或者&#34;读取SQL数据&#34;无论我可能有其他声明。

    阅读SQL数据 这明确告诉MySQL该函数只能从数据库中读取数据,因此,它不包含修改数据的指令,但它包含读取数据的SQL指令(e.q. SELECT)。

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

    没有SQL 这表明该例程不包含SQL语句。

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

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

      

    对例行程序性质的评估是基于“诚实”的   创建者:MySQL不会检查声明为DETERMINISTIC的例程   没有产生不确定结果的陈述。然而,   误解例程可能会影响结果或影响性能。   将一个不确定的例程声明为DETERMINISTIC可能会导致   导致优化器不正确的意外结果   执行计划选择。将确定性例程声明为   NONDETERMINISTIC可能会导致可用性降低性能   优化不被使用。

答案 1 :(得分:31)

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

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

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

READS SQL DATA
DETERMINISTIC

例如:

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

有关此问题的详细信息,请参阅Here

答案 2 :(得分:3)

遵循唐纳德的评论:

  

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

我所要做的就是:

  1. 在my.cnf(#log_bin)
  2. 中禁用了log_bin
  3. 重启mysql
  4. 导入数据库
  5. 启用log_bin
  6. 重启mysql
  7. 这就解决了导入问题。

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

答案 3 :(得分:1)

在Windows 10上,

我刚刚通过以下方式解决了这个问题。

  1. 转到my.ini并在 [mysqld]

    下添加这两行
    invoice_number%5B%5D=invoice_no_000&
    invoice_details%5B%5D=bcd&
    invoice_hours%5B%5D=cde&
    invoice_hours%5B%5D=fgh&
    invoice_materials%5B%5D=hij&
    invoice_materials%5B%5D=jkl&
    invoice_materials%5B%5D=klm&
    invoice_materials%5B%5D=lmn
    
  2. 重启MySQL服务

答案 4 :(得分:1)

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

enter image description here

答案 5 :(得分:0)

尝试设置该函数的定义器!

所以不是

CREATE FUNCTION get_pet_owner

您将编写类似于

的内容

CREATE DEFINER=procadmin@% FUNCTION get_pet_owner

如果用户 prodacmin 有权创建功能/过程,则该方法应该起作用。

在我的情况下,该函数通过MySQL Workbench生成时起作用,但是当直接作为SQL脚本运行时不起作用。进行上述更改可以解决问题。

答案 6 :(得分:0)

我在 ubuntu 上使用这个命令:

mysql -u root -p

并输入mysql服务器错误并在mysql中执行此命令:

SET GLOBAL log_bin_trust_function_creators = 1;