首页 > 数据库 >mysql log_bin_trust_function_creators

mysql log_bin_trust_function_creators

时间:2023-10-23 17:35:03浏览次数:52  
标签:bin function log DETERMINISTIC SQL creators 子程序

原文链接:https://blog.csdn.net/ayqy42602/article/details/98770328

在本地Mysql中创建函数时,报错如下:

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)

 

 

原因:

这是我们开启了bin-log, 我们就必须指定我们的函数是否是:
1 DETERMINISTIC 不确定的
2 NO SQL 没有SQl语句,当然也不会修改数据
3 READS SQL DATA 只是读取数据,当然也不会修改数据
4 MODIFIES SQL DATA 要修改数据
5 CONTAINS SQL 包含了SQL语句

其中在function里面,只有 DETERMINISTIC, NO SQL 和 READS SQL DATA 被支持。如果我们开启了 bin-log, 我们就必须为我们的function指定一个参数。

因为CREATE PROCEDURE, CREATE FUNCTION, ALTER PROCEDURE,ALTER FUNCTION,CALL, DROP PROCEDURE, DROP FUNCTION等语句都会被写进二进制日志,然后在从服务器上执行。但是,一个执行更新的不确定子程序(存储过程、函数、触发器)是不可重复的,在从服务器上执行(相对与主服务器是重复执行)可能会造成恢复的数据与原始数据不同,从服务器不同于主服务器的情况。

为了解决这个问题,MySQL强制要求:
在主服务器上,除非子程序被声明为确定性的或者不更改数据,否则创建或者替换子程序将被拒绝。
这意味着当创建一个子程序的时候,必须要么声明它是确定性的,要么它不改变数据。

声明方式有两种,
第一种:声明是否是确定性的
DETERMINISTIC和NOT DETERMINISTIC指出一个子程序是否对给定的输入总是产生同样的结果。
如果没有给定任一特征,默认是NOT DETERMINISTIC,所以必须明确指定DETERMINISTIC来声明一个子程序是确定性的。
这里要说明的是:使用NOW() 函数(或它的同义)或者RAND() 函数不会使一个子程序变成非确定性的。对NOW()而言,二进制日志包括时间戳并会被正确的执行。RAND()只要在一个子程序内被调用一次也可以被正确的复制。所以,www.linuxidc.com可以认为时间戳和随机数种子是子程序的确定性输入,它们在主服务器和从服务器上是一样的。

第二种:声明是否会改变数据
CONTAINS SQL, NO SQL, READS SQL DATA, MODIFIES SQL用来指出子程序是读还是写数据的。
无论NO SQL还是READS SQL DATA都指出,子程序没有改变数据,但是必须明确地指定其中一个,因为如果任何指定,默认的指定是CONTAINS SQL。

默认情况下,如果允许CREATE PROCEDURE 或CREATE FUNCTION 语句被接受,就必须明确地指定DETERMINISTIC 或 NO SQL与READS SQL DATA 中的一个,否则就会产生1418错误。

解决方法:

解决办法也有两种,
第一种是在创建子程序(存储过程、函数、触发器)时,声明为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。设置方法有三种:
1.在客户端上执行SET GLOBAL log_bin_trust_function_creators = 1(临时方案,MySQL服务重启会失效);
2.MySQL启动时,加上–log-bin-trust-function-creators选贤,参数设置为1
3.在MySQL配置文件my.ini或my.cnf中的[mysqld]段上加log-bin-trust-function-creators=1(永久方案,需要重启MySQL服务,配置才能生效)

标签:bin,function,log,DETERMINISTIC,SQL,creators,子程序
From: https://www.cnblogs.com/luna-hehe/p/17783027.html

相关文章

  • QtCreator Key Bindings
    快捷键|功能-----|-----Esc|切换到代码编辑状态F1|查看帮助(选中某一类或函数,按下F1,出现帮助文档)F2|在光标选中对象的声明和定义之间切换(和Ctrl+鼠标左键一样的效果,选中某一类或函数,按下F2,迅速定位到该类或函数声明的地方或被调用的地方)F3|查找下一个F4|头文件和源文......
  • could not chdir to home directory /home/user:permission denied /bin/bash:Permiss
    今天在vm上登录一个user的时候,发现正确输入用户名和密码后弹出了这样的信息,登陆不上.发现给出的信息中,permissiondenied而binpermiss;这种情况表明自己给该用户赋予的权限不足导致问题通过在/home目录下用ll检查到该用户的user权限是---通过chmod7user指令修改后仍......
  • org.apache.ibatis.binding.BindingException: Invalid bound statement (not found):
    org.apache.ibatis.binding.BindingException:Invalidboundstatement(notfound):com.tl666.comments.mapper.CommentsMapper.addRootComments2023-04-1213:40:06.160ERROR31228---[nio-8080-exec-2]o.a.c.c.C.[.[.[/].[dispatcherServlet]:Servlet.service()......
  • 统信UOS安装报probing edd edd=off to disable
    华三服务器,安装uos时提示probingeddedd=offtodisable就卡住了,在grub中加入edd=off也没有效果。最后使用UEFI启动,可以正常进入系统。......
  • [Microsoft Azure] Azure Function 如何重命名函数
    在开始之前,我们先了解一下AzureFunction的基本概念。AzureFunctions是MicrosoftAzure提供的一项无服务器计算服务,允许用户在云端运行代码而无需关心底层基础设施。通过使用AzureFunctions,您可以专注于编写业务逻辑,而无需担心服务器的管理和扩展。现在,让我们看看如何重命名Azu......
  • std::function逆向还原
    std::function的内存结构本文案例地址:https://wwmf.lanzout.com/b029diasb 密码:aregstd::function为lamda函数时本文的代码都是32位为例vftable首先我们可以从Func_impl_no_alloc_V_lambda得知这是一个类型为lamda的std::function容器,把虚表赋值到对象首地址。我们......
  • [Microsoft Azure] 如何查看 Azure Function的.NET SDK版本列表
    本文将介绍如何在MicrosoftAzure中查看和选择AzureFunction的.NETSDK版本列表,以便为您的项目选择合适的版本。在MicrosoftAzure中,AzureFunctions是一种用于在云端运行小型应用程序或功能的服务。它可以帮助我们在不需要管理基础设施的情况下快速构建和部署应用程......
  • [Microsoft Azure] 如何查看 Azure Function的.NET Runtime
    在本文中,我们将详细介绍如何在MicrosoftAzure中查看AzureFunction的.NETRuntime版本。了解如何找到所使用的.NET版本,确保您的Functions应用程序兼容并具有稳定性。在使用MicrosoftAzure的过程中,您可能会使用到AzureFunctions作为一个无服务器计算服务。而在......
  • Educational Codeforces Round 149 (Rated for Div. 2) C. Best Binary String
    给一个字符串\(s\)包含\(0,1,?\)。定义一个\(01\)串\(s\)的\(cost\)为:选择\(s\)的任意一个子段\([l,r]\)并\(reverse\)。将\(s\)变为一个非降序序列时的\(reverse\)最小次数即\(cost\)。你可以让\(s\)的\(?\)换成\(0/1\),使新\(s\)的\(cost\)......
  • v-bind="$attrs" v-on="$listeners"
    v-bind="$attrs"主要用于组件之间的隔代传值。例如有父组件A,子组件B,孙组件C三个组件。A组件中的值需要直接传给C,那么就需要在B中设置v-bind="$attrs",然后在C组件中用prop接收,此时就直接把值传给了C组件。父组件A<template><B_zujianmsg='123'/></template>子组件B......