MySQL的有个参数log_bin_trust_function_creators,官方文档对这个参数的介绍、解释如下所示:

简单介绍一下,当二进制日志启用后,这个变量就会启用。它控制是否可以信任存储函数创建者,不会创建写入二进制日志引起不安全事件的存储函数。如果设置为0(默认值),用户不得创建或修改存储函数,除非它们具有除CREATE ROUTINE或ALTER ROUTINE特权之外的SUPER权限。 设置为0还强制使用DETERMINISTIC特性或READS SQL DATA或NO SQL特性声明函数的限制。 如果变量设置为1,MySQL不会对创建存储函数实施这些限制。 此变量也适用于触发器的创建。 请参见第23.7节“Binary Logging of Stored Programs”。
下面我们测试一下,当开启二进制日志后,如果变量log_bin_trust_function_creators为OFF,那么创建或修改存储函数就会报“ERROR 1418 (HY000): 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)”这样的错误,如下所示:

在调用存储函数时,也会遇到这个错误,如下测试所示:

那么为什么MySQL有这样的限制呢? 因为二进制日志的一个重要功能是用于主从复制,而存储函数有可能导致主从的数据不一致。所以当开启二进制日志后,参数log_bin_trust_function_creators就会生效,限制存储函数的创建、修改、调用。那么此时如何解决这个问题呢?官方文档介绍如下,具体可以参考23.7 Binary Logging of Stored Programs
-
If you do not want to require function creators to have the
SUPERprivilege (for example, if all users with theCREATE ROUTINEprivilege on your system are experienced application developers), set the globallog_bin_trust_function_creatorssystem variable to 1. You can also set this variable by using the--log-bin-trust-function-creators=1option when starting the server. If binary logging is not enabled,log_bin_trust_function_creatorsdoes not apply.SUPERis not required for function creation unless, as described previously, theDEFINERvalue in the function definition requires it. -
If a function that performs updates is nondeterministic, it is not repeatable. This can have two undesirable effects:
-
It will make a slave different from the master.
-
Restored data will be different from the original data.
To deal with these problems, MySQL enforces the following requirement: On a master server, creation and alteration of a function is refused unless you declare the function to be deterministic or to not modify data. Two sets of function characteristics apply here:
-
The
DETERMINISTICandNOT DETERMINISTICcharacteristics indicate whether a function always produces the same result for given inputs. The default isNOT DETERMINISTICif neither characteristic is given. To declare that a function is deterministic, you must specifyDETERMINISTICexplicitly. -
The
CONTAINS SQL,NO SQL,READS SQL DATA, andMODIFIES SQL DATAcharacteristics provide information about whether the function reads or writes data. EitherNO SQLorREADS SQL DATAindicates that a function does not change data, but you must specify one of these explicitly because the default isCONTAINS SQLif no characteristic is given.
-
1: 如果数据库没有使用主从复制,那么就可以将参数log_bin_trust_function_creators设置为1。
mysql> set global log_bin_trust_function_creators=1;
这个动态设置的方式会在服务重启后失效,所以我们还必须在my.cnf中设置,加上log_bin_trust_function_creators=1,这样就会永久生效。
2:明确指明函数的类型,如果我们开启了二进制日志, 那么我们就必须为我们的function指定一个参数。其中下面几种参数类型里面,只有 DETERMINISTIC, NO SQL 和 READS SQL DATA 被支持。这样一来相当于明确的告知MySQL服务器这个函数不会修改数据。
1 DETERMINISTIC 不确定的
2 NO SQL 没有SQl语句,当然也不会修改数据
3 READS SQL DATA 只是读取数据,当然也不会修改数据
4 MODIFIES SQL DATA 要修改数据
5 CONTAINS SQL 包含了SQL语句

\
转自:https://www.cnblogs.com/kerrycode/p/7641835.html
感谢大佬潇湘隐者,膜拜学习!!!
MySQL的log_bin_trust_function_creators参数控制是否信任存储函数创建者,防止不安全事件记录到二进制日志。默认设置为0,要求创建或修改存储函数需具有SUPER权限且函数需声明DETERMINISTIC等特性。开启二进制日志后,该参数限制存储函数操作以保证主从复制数据一致性。解决办法包括设置参数为1或明确函数类型。
1980

被折叠的 条评论
为什么被折叠?



