当前位置: 首页 > 面试题库 >

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

司空胤
2023-03-14
问题内容

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

我不知道我需要改变什么。谁能帮我解决这个问题?


问题答案:

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

  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。
” 因此,似乎如果没有声明,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指令(即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 。同样,从未复制模式中读取数据的函数显然是NONDETERMINISTIC。*

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



 类似资料:
  • 我使用的是,我想配置将不同的内容异步记录到不同的日志文件中。 我创建了log4j2文件,但是仍然使用Spring Boot默认日志记录。如何切换日志记录?

  • 问题内容: 我需要与执行日志记录使用。 我在没有基本示例的情况下实现了日志记录? 也有小的样本在不使用日志的情况下使用(只是制作了)? 我不知道如何整合它? 问题答案: Spring使我们使用AOP变得非常容易。这是一个简单的日志记录示例: 然后只需配置你的applicationContext.xml(或等效文件): 你会在MyLogger类中注意到我@After在方法上方指定的内容。这被称为建议

  • 主要内容:启动和设置二进制日志,查看二进制日志,删除二进制日志,暂时停止二进制日志二进制日志(Binary Log)也可叫作变更日志(Update Log),是 MySQL 中非常重要的日志。主要用于记录数据库的变化情况,即 SQL 语句的 DDL 和 DML 语句,不包含数据记录查询操作。 如果 MySQL 数据库意外停止,可以通过二进制日志文件来查看用户执行了哪些操作,对数据库服务器文件做了哪些修改,然后根据二进制日志文件中的记录来恢复数据库服务器。 默认情况下,二进制日志

  • 问题内容: 我在Spring 3.5容器中将JpaTransactionManager与hibernate3一起使用。我无法为JPA启用日志记录。我希望看到用于调试我的某些服务的事务管理日志。我正在使用log4j。 这是我的log4j.properties中的内容 问题答案: 在启用JPATransactionManager的日志记录方面,这对我有用:1.下载logback jar(logback

  • 我试图熟悉docker生态系统,并尝试设置mysql数据库容器。使用这看起来像: 我的conf目录包含一个文件: 不幸的是,我没有这样得到任何日志文件。设置本身是正确的,并且使用了cnf文件。连接到容器并创建3个文件后,将它们添加到并重新启动容器,日志记录按预期工作。 我很确定这是一个常见的场景,我目前让它运行的方法看起来真的很愚蠢。正确的做法是什么? 我可以通过在Dockerfile中移动所有这

  • 我下载了kafka-clients-0.9.0.0。jar与maven一起使用,我希望我会看到类似于Kafka日志链接中的日志记录 然而,我不知道为什么我没有得到任何日志记录,即使我设置了引导。purpuse上的服务器错误,但它只是在没有发出任何警告的情况下被卡住了。我添加了几行代码以使用log4j打印到一个文件中,这似乎是可行的,但不知道为什么Kafka不能将事件记录到log4j中。 请注意,s