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

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

我不知道我需要改变什么,有人能帮我解决这个问题吗?

270903 次浏览

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

  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,那么它就被认为是“确定性的”。 这通常用于字符串或数学处理,但不限于此。

不确定 “决定论”的反义词。 “ 如果例程定义中既没有给出 DETERMINISTIC 也没有给出 NOT DETERMINISTIC,则默认值为 NOT DETERMINISTIC。若要声明函数是确定性的,必须显式指定 DETERMINISTIC。”。 因此,如果没有语句,MySQL 将把函数看作“ NOT DETERMINISTIC”。 手册中的这一说法与手册中另一领域的其他说法相矛盾,这些说法说明: ”< em > 当您创建一个存储函数时,您必须声明它是确定性的,或者它不修改数据。否则,数据恢复或复制可能不安全。 默认情况下,若要接受 CREATE FuncION 语句,必须显式指定至少一个 DETERMINISTIC、 NO SQL 或 READS SQL DATA。否则将发生错误

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

读取 SQL 数据 这显式地告诉 MySQL 该函数将只从数据库中读取数据,因此,它不包含修改数据的指令,而是包含读取数据的 SQL 指令(例如: q. SELECT)。

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

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

包含 SQL 这表明该例程包含 SQL 指令,但不包含读写数据的语句。如果没有显式地给出这些特征,那么这是默认值。这类语句的例子有 SELECT NOW ()、 SELECT 10 +@b、 SET@x = 1或 DO RELEASE _ LOCK (‘ abc’) ,这些语句执行时既不读也不写数据。

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

评估一个例行公事的性质是基于“诚实”的 Creator: MySQL 不检查声明为 DETERMINISTIC 的例程是否为 没有产生不确定性结果的语句。然而, 错误地声明例程可能会影响结果或影响性能。 将不确定的例程声明为 DETERMINISTIC 可能导致 导致优化器出现不正确的意外结果 执行计划选项。将确定性例程声明为 非确定性可能会导致可用性降低性能 不要使用优化

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

  • 默认情况下,至少接受一个 CREATEFUNCION 语句 必须指定 DETERMINISTIC、 NO SQL 或 READS SQL 数据之一 否则将发生错误:

为了解决这个问题,添加以下代码行:

READS SQL DATA
DETERMINISTIC

例如:

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

有关这个问题的更多细节,请阅读 给你

在唐纳德发表评论之后:

此变量在启用二进制日志记录时应用。

我要做的就是:

  1. 在 my.cnf 中禁用 log _ bin (# log _ bin)
  2. 重启 mysql
  3. 进口数据库
  4. 启用 log _ bin
  5. 重启 mysql

解决进口问题。

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

在 Windows10上,

我刚刚通过以下步骤解决了这个问题。

  1. 到 my.ini 中,在 < strong > [ mysqld ]下面添加这两行代码

    skip-log-bin
    log_bin_trust_function_creators = 1
    
  2. restart MySQL service

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

enter image description here

尝试为函数设置定义器!

所以

CREATE FUNCTION get_pet_owner

你会写一些类似于

CREATE DEFINER=procadmin@%函数 get _ pet _ owner

如果用户 催产素拥有创建函数/过程的权限,那么它应该可以工作。

在我的例子中,该函数在通过 MySQL 工作台生成时可以工作,但在直接作为 SQL 脚本运行时不能工作。做出上述更改就解决了问题。

我在 ubuntu 上使用这个命令:

mysql -u root -p

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

SET GLOBAL log_bin_trust_function_creators = 1;

MySQL 自动从 conf.dmysql.conf.d目录读取配置。因此,在目录 /etc/mysql/conf.d/中创建 custom.cnf并添加以下配置。

[mysqld]
log_bin_trust_function_creators=1

创建和保存文件需要 root 用户权限,然后重新启动 MySQL 服务器。