无法使用MySQL UDF功能

时间:2011-06-01 15:22:50

标签: mysql function user-defined-functions

我已经将一个UDF函数加载到MySQL中(没有选择任何特定的数据库)。它曾经在我的会话期间运行良好,但是当我尝试使用带有以下sql语句的函数时,我得到错误“ERROR 1305(42000):FUNCTION currentdatabase.myfunction不存在”:

select myfunction('aaa');

然后我尝试删除该功能,我得到了相同的错误代码:

mysql> drop function myfunction;
ERROR 1305 (42000): FUNCTION database.myfunction does not exist

如果选择了数据库。

否则会出现另一个错误代码:

ERROR 1046 (3D000): No database selected

所以我决定再次指定该函数,我得到以下错误代码:

CREATE FUNCTION myfunction RETURNS INT SONAME 'myfunction.so';
ERROR 1125 (HY000): Function 'myfunction' already exists

我的问题是:如何再次使用我的功能?

提前致谢。

注意:没有像其他几个网站上报道的那样的空间问题(“select myfunction('aaa');”)。

3 个答案:

答案 0 :(得分:6)

我最近遇到了这个问题,我自己也写了一篇关于它的快速博客文章:

  

installing a UDF recently我得到了   恼人的错误信息,似乎并不想消失。删除   尝试删除它之前的功能不起作用所以我使用了   以下一组升级命令以尝试获取它   安装。

但回到错误片刻:

bash > mysql -u user -p < installdb.sql
Enter password:
ERROR 1125 (HY000) at line 7: Function 'lib_mysqludf_ssdeep_info' already exists
这可以   只需使用以下选项即可解决:

     
  1. 尝试   删除该功能然后重新安装
  2. 删除   函数行来自mysql.func表,然后重新安装
  3.   
  4. 停止MySQL服务器(尝试选项2后),再次启动它   然后重新安装

在我的测试中,您不需要备份二进制数据库文件,因为@jmcejuela在他的回答中建议。

来源:http://simonholywell.com/post/2012/01/mysql-udf-install-error-function-already-exists.html

答案 1 :(得分:1)

我认为问题来自于在删除函数之前删除.so库。服务器仍然认为它具有函数,因为它们出现在SELECT * FROM mysql.func中,但当然调用这些函数失败了。不知何故,DROP不仅仅删除此表中的条目,还会检查是否找到了导致此失败的库。 CREATE假设首先检查导致此失败的func表...

解决方案是将func表(fql.MYI,func.MYD,fql.frm文件在mysql的data / mysql下)恢复到所有匹配的位置。

幸运的是我有这些文件的备份。否则你将不得不从一个新的mysql安装备份它们(你可以简单地在本地安装一个新服务器,不要删除你当前的服务器)

底线:在删除函数之前不要删除.so库。

答案 2 :(得分:-1)

在删除函数之前交换(不删除).so库时出现了一些错误。

重新启动服务器消除了错误消息,无论函数是否成功删除。 Mysqld只是查看了mysql.func表并从(新).so中加载了函数。我知道重新启动服务器并不总是一个选项,但如果是,那就快速完成。