在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)
我不知道我需要改变哪些事情。任何人都可以帮我解决这个问题吗?
答案 0 :(得分:150)
有两种方法可以解决这个问题:
在MySQL控制台中执行以下命令:
SET GLOBAL log_bin_trust_function_creators = 1;
将以下内容添加到mysql.ini配置文件中:
log_bin_trust_function_creators = 1;
该设置放宽了对非确定性功能的检查。非确定性函数是修改数据的函数(即具有更新,插入或删除语句)。有关详细信息,请参阅here。
请注意,如果未启用二进制日志记录,则此设置不适用。
Binary Logging of Stored Programs
如果未启用二进制日志记录,则log_bin_trust_function_creators会启用 不适用。
log_bin_trust_function_creators
启用二进制日志记录时,此变量适用。
最好的方法是更好地理解和使用存储函数的确定性声明。 MySQL使用这些声明来优化复制,并且仔细选择它们以进行健康的复制是一件好事。
<强> DETERMINISTIC 强> 如果例程对于相同的输入参数总是产生相同的结果而不是确定性,则该例程被认为是“确定性的”。 这主要用于字符串或数学处理,但不限于此。
NOT DETERMINISTIC 与'#34;决定论&#34;相反。 &#34; 如果在例程定义中既未给出DETERMINISTIC也未给出DETERMINISTIC,则默认值为NOT DETERMINISTIC。要声明函数是确定性的,必须明确指定DETERMINISTIC。&#34;。 因此,似乎如果没有声明,MySQl会将该功能视为&#34; NOT DETERMINISTIC&#34;。 本手册中的陈述与其他手册领域的其他陈述相矛盾,该陈述表明: &#34; 创建存储函数时,必须声明它是确定性的或不修改数据。否则,数据恢复或复制可能不安全。 默认情况下,要接受CREATE FUNCTION语句,必须至少明确指定DETERMINISTIC,NO SQL或READS SQL DATA中的一个。否则会发生错误&#34;
我个人在MySQL 5.5中遇到错误,如果没有声明,所以我总是至少提出一个声明&#34; DETERMINISTIC&#34;,&#34; NOT DETERMINISTIC&#34;,&#34; NO SQL& #34;或者&#34;读取SQL数据&#34;无论我可能有其他声明。
阅读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(&#39; abc&#39;),它们既不执行读也不执行写数据。
请注意,MySQL函数不是确定性安全的,例如:NOW(),UUID()等,它们可能会在不同的机器上产生不同的结果,因此必须声明包含此类指令的用户函数因为没有决定性。 此外,从未复制的模式中读取数据的函数显然是NONDETERMINISTIC。 *
对例行程序性质的评估是基于“诚实”的 创建者:MySQL不会检查声明为DETERMINISTIC的例程 没有产生不确定结果的陈述。然而, 误解例程可能会影响结果或影响性能。 将一个不确定的例程声明为DETERMINISTIC可能会导致 导致优化器不正确的意外结果 执行计划选择。将确定性例程声明为 NONDETERMINISTIC可能会导致可用性降低性能 优化不被使用。
答案 1 :(得分:31)
创建存储函数时,必须声明它是 确定性或不修改数据。否则,它可能是 数据恢复或复制不安全。
默认情况下,至少要接受CREATE FUNCTION语句 必须指定DETERMINISTIC,NO SQL或READS SQL DATA之一 明确。否则会发生错误:
要修复此问题,请在Return和Before Begin语句后添加以下行:
READS SQL DATA
DETERMINISTIC
例如:
CREATE FUNCTION f2()
RETURNS CHAR(36) CHARACTER SET utf8
/*ADD HERE */
READS SQL DATA
DETERMINISTIC
BEGIN
有关此问题的详细信息,请参阅Here
答案 2 :(得分:3)
遵循唐纳德的评论:
启用二进制日志记录时,此变量适用。
我所要做的就是:
这就解决了导入问题。
(然后我会审核程序员的代码以提出改进建议)
答案 3 :(得分:1)
在Windows 10上,
我刚刚通过以下方式解决了这个问题。
转到my.ini并在 [mysqld]
下添加这两行invoice_number%5B%5D=invoice_no_000&
invoice_details%5B%5D=bcd&
invoice_hours%5B%5D=cde&
invoice_hours%5B%5D=fgh&
invoice_materials%5B%5D=hij&
invoice_materials%5B%5D=jkl&
invoice_materials%5B%5D=klm&
invoice_materials%5B%5D=lmn
重启MySQL服务
答案 4 :(得分:1)
答案 5 :(得分:0)
尝试设置该函数的定义器!
所以不是
CREATE FUNCTION get_pet_owner
您将编写类似于
的内容 CREATE DEFINER=
procadmin
@%
FUNCTION get_pet_owner
如果用户 prodacmin 有权创建功能/过程,则该方法应该起作用。
在我的情况下,该函数通过MySQL Workbench生成时起作用,但是当直接作为SQL脚本运行时不起作用。进行上述更改可以解决问题。
答案 6 :(得分:0)
我在 ubuntu 上使用这个命令:
mysql -u root -p
并输入mysql服务器错误并在mysql中执行此命令:
SET GLOBAL log_bin_trust_function_creators = 1;