在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)
我不知道我需要改变哪些事情.任何人都可以帮我解决这个问题吗?
Don*_*nal 179
有两种方法可以解决这个问题:
在MySQL控制台中执行以下命令:
SET GLOBAL log_bin_trust_function_creators = 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指令(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'),它们既不执行读也不执行写数据.
请注意,有些函数不具有确定性,例如:NOW(),UUID()等,它们可能会在不同的机器上产生不同的结果,因此包含此类指令的用户函数必须声明为NOT DETERMINISTIC .此外,从未复制的模式中读取数据的函数显然是NONDETERMINISTIC.*
对例程性质的评估基于创建者的"诚实":MySQL不会检查声明为DETERMINISTIC的例程是否没有产生非确定性结果的语句.但是,错误地说明例程可能会影响结果或影响性能.将非确定性例程声明为DETERMINISTIC可能会导致优化程序选择错误的执行计划,从而导致意外结果.将确定性例程声明为NONDETERMINISTIC可能会导致不使用可用的优化,从而降低性能.
Sun*_*S.M 33
创建存储函数时,必须声明它是确定性的或不修改数据.否则,数据恢复或复制可能不安全.
默认情况下,要接受CREATE FUNCTION语句,必须至少明确指定DETERMINISTIC,NO SQL或READS SQL DATA中的一个.否则会发生错误:
要解决此问题,请在Return和Before Begin语句后添加以下行:
READS SQL DATA
DETERMINISTIC
Run Code Online (Sandbox Code Playgroud)
例如 :
CREATE FUNCTION f2()
RETURNS CHAR(36) CHARACTER SET utf8
/*ADD HERE */
READS SQL DATA
DETERMINISTIC
BEGIN
Run Code Online (Sandbox Code Playgroud)
有关此问题的更多详细信息,请阅读此处
小智 25
我在 ubuntu 上使用这个命令:
mysql -u root -p
Run Code Online (Sandbox Code Playgroud)
并输入mysql server error并在mysql中执行以下命令:
SET GLOBAL log_bin_trust_function_creators = 1;
Run Code Online (Sandbox Code Playgroud)
小智 5
遵循唐纳德的评论:
当启用二进制日志记录时,此变量适用。
我所要做的就是:
那一步解决了导入问题。
(然后我会查看程序员的代码以提出改进建议)
| 归档时间: |
|
| 查看次数: |
108899 次 |
| 最近记录: |