我正在尝试在 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 不要担心,方法是授予用户 SUPER 权限或设置log_bin_trust_function_creators = 1
(如报告所述不同的文章和stackoverflow 答案)
我可以这样做,但我使用触发器作为日志记录机制,并NOW()
在其中调用。这显然是不确定的。
但进一步阅读后,他们似乎说,这些问题仅在binlog_format
设置为STATEMENT
或换句话说,如果数据库记录已运行的 mysql 语句而不是结果行时才会出现。
所以总结一下,如果我的 binlog_format 设置为MIXED
或ROW
我不应该担心任何这些,而只是设置log_bin_trust_function_creators
为能够创建这些触发器,否则由于我的触发器是非确定性的,我可能会遇到可能的恢复和复制问题。
我的理解正确吗?抱歉解释得这么长,但我想确保我对文档的理解是准确的
答案1
通过使用虚假时间记录和其他解决方法在语句复制中处理非确定性函数NOW()
,以便复制流最终能够按照预期获得一致的从属。
log_bin_trust_function_creators
是指当过程/函数被标记为确定性时,它们确实是确定性的。它可以全局设置,而不是授予 SUPER 权限。
复制格式有权衡,但如果您不进行批量删除,则 MIXED/ROW 格式可能会使您避免许多与触发器/程序相关的复杂情况。
答案2
我希望文档对此能更清楚一些。但我认为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
启用的情况下产生错误。
也许它仍然会发出这个警告,因为即使在基于行的模式下,仍然有一些类型的非确定性函数对于复制是不安全的(例如,引用非确定性函数的 DEFAULT 子句)因此,这个警告仍然适用,即“确保你知道自己在做什么”。
无论如何,在我看来,如果您需要使用非确定性函数,最好的选择是使用binlog_format=ROW
并log_bin_trust_function_creators
确保您的函数和过程没有任何类似的危险边缘情况。