MySQL开启bin-log后调用存储过程或者函数鉯及触发器时,会出现错误号为1418的错误:
FUNCTION等语句都会被写进二进制日志,然后在从服务器上执行但是,一个执行更新的不确定子程序(存储过程、函数、触发器)是不可重复的在从服务器上执行(相对与主服务器是重复执行)可能会造成恢复的数据与原始数据不同,从服务器不同于主服务器的情况
为了解决这个问题,MySQL强制要求:
在主服务器上除非子程序被声明为确定性的或者不更改数据,否则创建或者替换子程序将被拒绝
这意味着当创建一个子程序的时候,必须要么声明它是确定性的要么它不改变数据。
第一种:声明是否是确定性的
如果没有給定任一特征默认是NOT DETERMINISTIC,所以必须明确指定DETERMINISTIC来声明一个子程序是确定性的
这里要说明的是:使用NOW() 函数(或它的同义)或者RAND() 函数不会使一个孓程序变成非确定性的。对NOW()而言二进制日志包括时间戳并会被正确的执行。RAND()只要在一个子程序内被调用一次也可以被正确的复制所以,可以认为时间戳和随机数种子是子程序的确定性输入它们在主服务器和从服务器上是一样的。