在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)
我不知道我需要更改哪些内容。谁能帮我解决这个问题?
有两种方法可以解决此问题:
SET GLOBAL log_bin_trust_function_creators = 1;
log_bin_trust_function_creators = 1;
该设置放宽了对非确定性函数的检查。非确定性函数是修改数据的函数(即具有更新、插入或删除语句)。有关更多信息,请参见此处。
请注意,如果未启用二进制日志记录,则此设置不适用。
存储程序的二进制记录
如果未启用二进制日志记录,则 log_bin_trust_function_creators 不适用。
log_bin_trust_function_creators
此变量在启用二进制日志记录时适用。
最好的方法是更好地理解和使用存储函数的确定性声明。MySQL 使用这些声明来优化复制,仔细选择它们以获得健康的复制是一件好事。
DETERMINISTIC 如果例程对于相同的输入参数总是产生相同的结果,则认为例程是“确定的”,否则为 NOT DETERMINISTIC。这主要用于字符串或数学处理,但不限于此。
NOT DETERMINISTIC 与“DETERMINISTIC”相反。” 如果例程定义中既没有给出 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’),它们执行但既不读取也不写入数据。
注意,有一些 MySQL 函数不是确定性安全的,例如:NOW()、UUID() 等,在不同的机器上可能会产生不同的结果,所以包含此类指令的用户函数必须声明为 NOT DETERMINISTIC . 此外,从非复制模式中读取数据的函数显然是非确定性的。*
对例程性质的评估基于创建者的“诚实”:MySQL 不会检查声明为 DETERMINISTIC 的例程是否没有产生不确定结果的语句。 但是,错误地声明例程可能会影响结果或影响性能。将非确定性例程声明为 DETERMINISTIC 可能会导致优化器做出不正确的执行计划选择,从而导致意外结果。将确定性例程声明为 NONDETERMINISTIC 可能会导致不使用可用的优化,从而降低性能。