MySQL参数之log_bin_trust_function_creators

MySQL参数之log_bin_trust_function_creators

1.问题

问题:执行创建函数的sql文件报错如下;

[Err] 1419 - 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)

2.解决办法

解决办法有两种:

第一种:

在创建子程序(存储过程、函数、触发器)时,声明为DETERMINISTIC或NO SQL与READS SQL DATA中的一个

例如: 
CREATE DEFINER = CURRENT_USER PROCEDURE `NewProc`()     
DETERMINISTIC BEGIN #Routine body goes here... END;;

第二种:

信任子程序的创建者,禁止创建、修改子程序时对SUPER权限的要求,设置log_bin_trust_routine_creators全局系统变量为1。

其中mysql设置log_bin_trust_routine_creators全局系统变量为1办法有三种:

  • 1、在客户端执行SET GLOBAL log_bin_trust_function_creators = 1; 需要用户具备SUPER权限。
  • 2、MySQL启动时,加上--log-bin-trust-function-creators选项,参数设置为1。
  • 3、在MySQL配置文件my.ini或my.cnf中的[mysqld]段上加log-bin-trust-function-creators=1

3.参数log_bin_trust_function_creators 介绍

其中官方文档对参数log_bin_trust_function_creators 的介绍、解释如下所示:

简单介绍一下,当二进制日志启用后,这个变量就会启用。它控制是否可以信任存储函数创建者,不会创建写入二进制日志引起不安全事件的存储函数。如果设置为0(默认值),用户不得创建或修改存储函数,除非它们具有除CREATE ROUTINE或ALTER ROUTINE特权之外的SUPER权限。 设置为0还强制使用DETERMINISTIC特性或READS SQL DATA或NO SQL特性声明函数的限制。 如果变量设置为1,MySQL不会对创建存储函数实施这些限制。 此变量也适用于触发器的创建。

4.限制的原因

那么为什么MySQL有这样的限制呢? 因为二进制日志的一个重要功能是用于主从复制,而存储函数有可能导致主从的数据不一致。所以当开启二进制日志后,参数log_bin_trust_function_creators就会生效,限制存储函数的创建、修改、调用。那么此时如何解决这个问题呢?官方文档介绍如下,具体可以参考23.7 Binary Logging of Stored Programs

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语句

posted @ 2022-02-18 16:24  kuzane  阅读(641)  评论(0)    收藏  举报