2011-06-01 56 views
5

我已經加載了一個UDF函數到MySQL(沒有選擇任何特定的數據庫)。它用我的會話過程中很好地工作,但現在我得到的錯誤「ERROR 1305(42000):功能currentdatabase.myfunction不存在」當我嘗試使用功能與下面的SQL語句:不能使用MySQL的UDF功能

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 

我的問題是:如何重新使用我的功能?

在此先感謝。

注意:沒有像在其他幾個網站上報告的「選擇myfunction('aaa');」)這樣的空間問題。

+0

我遇到同樣的問題。我相信問題是,我們(至少我是)在刪除函數或mysqld仍在運行之前刪除共享的.so庫。不知道如何解決這個問題,有人? 'SELECT * FROM mysql.func'列出我想要使用的函數。 – juanmirocks 2011-11-10 10:17:27

回答

1

我相信問題來自刪除.so庫,然後再刪除函數。服務器仍然認爲它具有功能,因爲它們出現在SELECT * FROM mysql.func中,但當然調用這些函數失敗。不知何故,DROP不會簡單地刪除此表中的條目,但也會檢查是否找到導致此失敗的庫。 CREATE據說只是檢查第一個func表,這使得這個失敗...

解決的辦法是恢復func表(func.MYI,func.MYD,func.frm文件在你的mysql的數據/ mysql下)到點一切都匹配。

幸運的是我有這些文件的備份。否則,你將不得不從一個新的mysql安裝中進行備份(你可以簡單地在本地安裝一個新的服務器而不是刪除你當前的服務器)

底線:在刪除函數之前不要刪除.so庫。

5

我最近遇到這個問題我自己和我放在一起快速的博客文章吧:

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. 停止MySQL服務器(嘗試選項2)後,再次啓動它, 然後重新安裝

從我的測試中,你不需要有你的二進制數據庫文件的備份正如@jmcejuela在他的回答中所暗示的那樣。

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

+1

+1 2.從mysql.func中刪除函數行,重新啓動服務器,然後重新創建爲我工作的函數。 – kfmfe04 2013-04-30 05:03:11

-1

下降的功能(S)之前換出時(不會放棄)的.so庫得到了一些這樣的錯誤。

重新啓動服務器消除了錯誤消息,無論函數是否成功刪除。 Mysqld只是查看mysql.func表並從(新).so中加載函數。我知道重新啓動服務器並不總是一種選擇,但如果是這樣,它很快且完整。