- mysql/
- Mysql 已启用确定性、无SQL或读取其声明中的SQL数据以及二进制日志记录
Mysql 已启用确定性、无SQL或读取其声明中的SQL数据以及二进制日志记录
Mysql 已启用确定性、无SQL或读取其声明中的SQL数据以及二进制日志记录,mysql,Mysql,在mysql中导入数据库时,出现如下错误:
1418(HY000)第10185行:此函数在其声明中没有确定性、无SQL或读取SQL数据,并且启用了二进制日志记录(您*可能*希望使用不太安全的日志\u bin\u trust\u函数\u creators变量)
我不知道我需要改变什么。有谁能帮我解决这个问题吗?有两种方法可以解决这个问题:
在MySQL控制台中执行以下操作:
设置全局日志\u bin\u信任函数\u creators=1
将以下内容添加到mysql.ini配置文件中:
log\u
在mysql中导入数据库时,出现如下错误:
1418(HY000)第10185行:此函数在其声明中没有确定性、无SQL或读取SQL数据,并且启用了二进制日志记录(您*可能*希望使用不太安全的日志\u bin\u trust\u函数\u creators变量)
我不知道我需要改变什么。有谁能帮我解决这个问题吗?有两种方法可以解决这个问题:
在MySQL控制台中执行以下操作:
设置全局日志\u bin\u信任函数\u creators=1代码>
将以下内容添加到mysql.ini配置文件中:
log\u bin\u trust\u function\u creators=1代码>
该设置放松了对非确定性函数的检查。非确定性函数是修改数据的函数(即具有update、insert或delete语句)。有关详细信息,请参阅
请注意,如果未启用二进制日志记录,则此设置不适用
如果未启用二进制日志记录,则日志\u bin\u trust\u函数\u创建者会启用
不适用
启用二进制日志记录时,此变量适用
最好的方法是更好地理解和使用存储函数的确定性声明。MySQL使用这些声明来优化复制,仔细选择它们以获得健康的复制是一件好事
确定性的
如果一个例程总是对相同的输入参数产生相同的结果,而在其他情况下不具有确定性,则该例程被认为是“确定性的”。
这主要用于字符串或数学处理,但不限于此
不确定性
与“确定性”相反。
“如果例程定义中既没有给出确定性也没有给出非确定性,则默认为非确定性。若要声明函数是确定性的,必须显式指定确定性。”。
因此,如果没有声明,MySQl会将函数视为“不确定”。
手册中的这一陈述与手册另一部分的其他陈述相矛盾,说明:
创建存储函数时,必须声明它是确定性的,或者它不修改数据。否则,它可能对数据恢复或复制不安全。
默认情况下,要接受CREATE FUNCTION语句,必须显式指定DETERMINISTIC、NO SQL或READS SQL数据中的至少一个。否则将发生错误“
我个人在MySQL5.5中遇到了一个错误,如果没有声明,那么我总是至少声明一个“确定性”、“非确定性”、“无SQL”或“读取SQL数据”,而不考虑其他声明
读取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('abc'),它们执行时既不读取也不写入数据
请注意,有些MySQL函数不是确定性安全函数,例如:NOW()、UUID()等,它们可能在不同的机器上产生不同的结果,因此包含此类指令的用户函数必须声明为非确定性函数。
此外,从未复制模式读取数据的函数显然是不确定的。
*
对日常工作性质的评估是基于员工的“诚实”
creator:MySQL不检查声明的例程是否是确定性的
没有产生不确定结果的语句。然而,
错误声明例程可能会影响结果或性能。
将非确定性例程声明为确定性例程可能会导致
导致优化器做出不正确选择的意外结果
执行计划选择。将确定性例程声明为
不确定性可能会导致可用的
不使用优化
- 创建存储函数时,必须声明它是
确定性或不修改数据。否则,它可能是
数据恢复或复制不安全
- 默认情况下,对于要接受的CREATEFUNCTION语句,至少
必须指定确定性、无SQL或读取SQL数据中的一个
明确地否则会发生错误:
要解决此问题,请在Return语句之后和Begin语句之前添加以下行:
READS SQL DATA
DETERMINISTIC
例如:
CREATE FUNCTION f2()
RETURNS CHAR(36) CHARACTER SET utf8
/*ADD HERE */
READS SQL DATA
DETERMINISTIC
BEGIN
有关此问题的更多详细信息,请阅读唐纳德的评论:
启用二进制日志记录时,此变量适用
我所要做的就是:
my.cnf中禁用的日志存储库(#日志存储库)
重新启动mysql
导入数据库
启用日志存储库
重新启动mysql
这一步解决了进口问题
(然后我将查看程序员的代码以提出改进建议)在Windows 10上
我只是通过以下方法解决了这个问题
转到my.ini并将这两行添加到[mysqld]
skip-log-bin
log_bin_trust_function_creators = 1
重新启动MySQL服务
当您的函数是确定性的时,您可以安全地将其声明为确定性的。
“确定性”关键字的位置如下所示
尝试设置