小编典典

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

all

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

我不知道我需要更改哪些内容。谁能帮我解决这个问题?


阅读 90

收藏
2022-08-24

共1个答案

小编典典

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

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

SET GLOBAL log_bin_trust_function_creators = 1;

  1. 将以下内容添加到 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”相反。” 如果例程定义中既没有给出 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
可能会导致不使用可用的优化,从而降低性能。

2022-08-24