我试图在mysql数据库上创建触发器。在这样做时,我遇到了以下错误:
You do not have the SUPER privilege and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators variable)
在对MySQL医生进行了一些研究之后,我很清楚,在创建触发器或存储过程时,您可能会遇到它们不确定的风险,并会破坏二进制日志。这是因为如果这些函数中的任何一个在相同的输入下可能产生不同的结果,则二进制日志将无法正确地用于复制或数据恢复。
这方面的快速解决办法是告诉mysql不要担心,给用户超级特权或设置log_bin_trust_function_creators = 1 (如不同文章和stackoverflow答案所报告的)
我可以这样做,但我使用触发器作为日志机制,并在其中调用NOW()。这显然是不确定的。
尽管他们似乎表示,只有当binlog_format设置为STATEMENT时才会出现这些问题,换句话说,如果db记录已运行的mysql语句,而不是结果行,则会进一步阅读。
因此,如果我的binlog_format设置为MIXED或ROW,那么我就不应该担心这些问题,而只是将log_bin_trust_function_creators设置为能够创建这些触发器,否则,由于触发器是不确定的,我可能会遇到可能的恢复和复制问题。
我对此的理解是正确的吗?对于冗长的解释我很抱歉,但我想确保我对文档的解释是准确的。
发布于 2018-08-19 00:52:25
像NOW()这样的非确定性函数是在语句复制中通过使用假时间记录和其他变通方法来处理的,这样复制流就会像预期的那样成为一致的从属程序。
log_bin_trust_function_creators是指当过程/函数被标记为确定性时,它们实际上是确定性的。它可以全局设置,而不是授予超级权限。
但是,复制格式是有权衡的,但是如果您不执行批量删除,很可能混合/行格式将使您能够避免触发器/过程所带来的许多复杂问题。
发布于 2022-09-30 19:30:55
我希望这方面的文件能更清楚一点。但我认为STATEMENT和MIXED在这里都是危险的模式,您需要使用ROW。
根据文件:
在使用基于行的日志记录时,在安全和不安全语句的处理方面没有区别.
这意味着log_bin_trust_function_creators不应该在binlog_format是ROW时起作用。
但是,即使使用基于行的复制,非确定性函数声明仍会产生ERROR 1418 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)错误,而不启用log_bin_trust_function_creators。
也许它仍然会发出这个警告,因为即使在基于行的模式下,仍然存在某些类型的不确定函数,这些函数对复制不安全(例如,一个引用非确定性函数的缺省子句)。因此,这个警告仍然适用于“确保你知道自己在做什么”。
无论如何,在我看来,如果您需要使用非确定性函数,您最好的选择是在binlog_format=ROW中使用log_bin_trust_function_creators,并确保您的函数和过程没有任何危险的边缘情况。
https://serverfault.com/questions/923495
复制相似问题