无法使用MySQL UDF函数

无法使用MySQL UDF函数,mysql,function,user-defined-functions,Mysql,Function,User Defined Functions,我已经在MySQL中加载了一个UDF函数(没有选择任何特定的DB)。它过去在我的会话中工作得很好,但现在我在尝试将函数与以下sql语句一起使用时遇到错误“error 1305(42000):FUNCTION currentdatabase.myfunction不存在”: select myfunction('aaa'); 然后我尝试删除该函数,但得到了相同的错误代码: mysql> drop function myfunction; ERROR 1305 (42000): FUNCTIO

我已经在MySQL中加载了一个UDF函数(没有选择任何特定的DB)。它过去在我的会话中工作得很好,但现在我在尝试将函数与以下sql语句一起使用时遇到错误“error 1305(42000):FUNCTION currentdatabase.myfunction不存在”:

select myfunction('aaa');
然后我尝试删除该函数,但得到了相同的错误代码:

mysql> drop function myfunction;
ERROR 1305 (42000): FUNCTION database.myfunction does not exist
CREATE FUNCTION myfunction RETURNS INT SONAME 'myfunction.so';
ERROR 1125 (HY000): Function 'myfunction' already exists
如果选择了数据库

另一个错误代码,否则:

ERROR 1046 (3D000): No database selected
因此,我决定再次指定该函数,并得到以下错误代码:

mysql> drop function myfunction;
ERROR 1305 (42000): FUNCTION database.myfunction does not exist
CREATE FUNCTION myfunction RETURNS INT SONAME 'myfunction.so';
ERROR 1125 (HY000): Function 'myfunction' already exists
我的问题是:如何再次使用我的函数

提前谢谢


注意:没有其他几个网站报道的“选择myfunction('aaa');”)之类的空间问题。

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

解决方案是将func表(mysql的data/mysql下的func.MYI、func.MYD、func.frm文件)恢复到所有内容都匹配的位置

幸运的是我有这些文件的备份。否则,您将不得不从新的mysql安装中备份它们(您只需在本地安装一个新服务器,而不是删除当前服务器)


一句话:在删除函数之前不要删除.so库。

我自己最近遇到了这个问题,我写了一篇关于这个问题的博客:

当我得到一个 恼人的错误消息,似乎不想消失。删除 在尝试删除之前,该函数不起作用,因此我使用 下面是一组升级命令,以尝试将其升级到 安装。

但暂时回到错误:
bash > mysql -u user -p < installdb.sql
Enter password:
ERROR 1125 (HY000) at line 7: Function 'lib_mysqludf_ssdeep_info' already exists
bash>mysql-u user-p
  • 企图 要删除该功能然后重新安装,请删除 从mysql.func表中删除函数行,然后重新安装它
  • 停止MySQL服务器(尝试选项2后),再次启动并 然后重新安装它
  • 根据我的测试,您不需要像@jmcejuela在回答中所建议的那样备份二进制数据库文件


    来源:

    在删除函数之前,在调出(而不是删除).so库时出现了一些错误


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

    我也有同样的问题。我相信问题在于我们(至少我确实)在删除函数之前或mysqld仍在运行时删除了shared.so库。不知道怎么解决这个问题,有人吗
    SELECT*FROM mysql.func
    列出了我想要使用的函数。+1 2。从mysql.func中删除函数行,重新启动服务器,然后重新创建对我有用的函数。这对我不起作用,似乎我的percona xtradb集群让这变得有点复杂