#昊鼎王五:解决mysql导入function函数失败问题的方法
#引子
有时候在WEB界面上操作,会报如下错:
nested exception is com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: FUNCTION haoding205_op.function_xyzInfo does not exist
#排查
上面的意思是function函数没有找到,我明明是导入了数据库的啊,为什么没有呢?
再去查看导入日志:
原来是在创建存储过程时就出错了,信息如下:
ERROR 1418 (HY000): This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled
#原因定位
这是我们的主从MYSQL开启了bin-log(二进制LOG), 函数面临着如下选项
DETERMINISTIC 不确定的
NO SQL 没有SQl语句,当然也不会修改数据
READS SQL DATA 只是读取数据,当然也不会修改数据
MODIFIES SQL DATA 要修改数据
CONTAINS SQL 包含了SQL语句
#解决方法
##1.快速生效法
其中在function里面,只有 DETERMINISTIC, NO SQL 和 READS SQL DATA 被支持。如果我们开启了 bin-log, 我们就必须为我们的function指定一个参数。
解决方法:
mysql -uroot -p
mysql> show variables like 'log_bin_trust_function_creators';
+---------------------------------+-------+
| Variable_name | Value |
+---------------------------------+-------+
| log_bin_trust_function_creators | OFF |
+---------------------------------+-------+
mysql> set global log_bin_trust_function_creators=1;
mysql> show variables like 'log_bin_trust_function_creators';
+---------------------------------+-------+
| Variable_name | Value |
+---------------------------------+-------+
| log_bin_trust_function_creators | ON |
+---------------------------------+-------+
将该参数修改成ON之后,导入function函数就不会报上述的错误了。
##2.冷生效法
在第一种方法修改了参数以后,如果mysqld重启,这个参数又会消失。为了使其不受重启影响,我们在/etc/my.cnf配置文件中
添加:
log_bin_trust_function_creators=1
/etc/my.cnf添加了如上的参数之后,重启之后就生效。然后再次导入function函数也不会报错了。
好了,聪明如你,解决function函数导入失败的问题的方法就写到这里了。
解决了阻挡导入的前的报错,下一篇讲如何更快更好的导出和导入function函数或MYSQL全库。
还有其他问题的可以在评论区留言或者如下联系方式扫码向我提问。