2011-06-01 41 views
5

Załadowałem funkcję UDF do MySQL (bez wybrania żadnego konkretnego DB). Kiedyś dobrze pracować podczas sesji, ale teraz pojawia się błąd „ERROR 1305 (42000): Funkcja currentdatabase.myfunction nie istnieje”, gdy próbuję użyć funkcji z następującą instrukcję SQL:Nie można użyć funkcji UDF MySQL

select myfunction('aaa'); 

I następnie próbowałem upuścić funkcję i otrzymałem ten sam kod błędu:

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

jeśli wybrano DB.

inny kod błędu inaczej:

ERROR 1046 (3D000): No database selected 

Więc postanowiłem ponownie określić funkcję i mam następujący kod błędu:

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

Moje pytanie brzmi: w jaki sposób ponownie użyć mojej funkcji?

Z góry dziękuję.

Uwaga: nie ma problemu z przestrzenią kosmiczną, jak ("wybierz moją funkcję (" aaa ");"), jak opisano na kilku innych stronach internetowych.

+0

Mam ten sam problem. Uważam, że problem polega na tym, że (przynajmniej ja to zrobiłem) usunę udostępnioną bibliotekę .so przed upuszczeniem funkcji lub gdy mysqld nadal działa. Nie wiesz, jak to rozwiązać, ktoś? 'SELECT * FROM mysql.func' zawiera listę funkcji, których chcę użyć. – juanmirocks

Odpowiedz

1

Wierzę, że problem pochodzi z usunięcia biblioteki .so przed upuszczeniem funkcji/s. Serwer nadal uważa, że ​​ma funkcje, ponieważ pojawiają się one pod numerem SELECT * FROM mysql.func, ale oczywiście wywołanie tych funkcji kończy się niepowodzeniem. W jakiś sposób DROP nie usuwa po prostu wpisów w tej tabeli, ale także sprawdza, czy znalezione biblioteki powodują niepowodzenie. CREATE podobno tylko najpierw sprawdzić tabelę func który sprawia, że ​​to nie ...

Rozwiązaniem jest przywrócenie tabeli funkcjono (func.MYI, func.MYD pliki func.frm pod twoim MySQL danych/MySQL) do punktu wszystko pasuje.

Na szczęście miałem kopię zapasową tych plików. W przeciwnym razie będziesz musiał wykonać kopię zapasową z nowej instalacji mysql (możesz po prostu zainstalować lokalnie nowy serwer, aby nie usuwać bieżącego).

Dolna linia: nie usuwaj bibliotek .so przed upuszczeniem funkcji.

5

Niedawno spotkałem tej kwestii mój własny i ułożyła krótki wpis na blogu o tym:

Kiedy installing a UDF recently Dostałem wiadomość błędzie irytujące, które nie wydają się chce odejść. Usunięcie tej funkcji przed próbą usunięcia nie działało, więc użyłem kolejnego zestawu eskalujących poleceń, aby spróbować zainstalować go na .

Ale wracając do błędu przez chwilę:

bash > mysql -u user -p < installdb.sql 
Enter password: 
ERROR 1125 (HY000) at line 7: Function 'lib_mysqludf_ssdeep_info' already exists
To może być rozwiązano bardzo prosto z następujących opcji:

  1. Próba aby usunąć funkcję, a następnie zainstalować go ponownie
  2. Usuń wiersz funkcyjny z mysql .Stół func a następnie zainstalować go ponownie
  3. Zatrzymaj serwer MySQL (po opcji 2 stara), uruchom go ponownie i następnie zainstalować go ponownie

od mojego badania nie trzeba mieć kopie zapasowe binarnych plików baz danych jak sugeruje @jmcejuela w swojej odpowiedzi.

Źródło: http://simonholywell.com/post/2012/01/mysql-udf-install-error-function-already-exists.html

+1

+1 2. usunięcie wiersza funkcji z mysql.func, ponowne uruchomienie serwera, a następnie ponowne utworzenie funkcji działającej dla mnie. – kfmfe04

-1

Got niektóre z tych błędów podczas wymieniając (nie spada) z biblioteki .so przed zrzuceniem funkcję (y).

Ponowne uruchomienie serwera wyeliminowało komunikaty o błędach, niezależnie od tego, czy funkcje zostały pomyślnie usunięte, czy nie. MySQL po prostu spojrzał na tabelę mysql.func i wczytał funkcje z (nowego) .so. Wiem, że zrestartowanie serwera nie zawsze jest opcją, ale jeśli tak, to jest szybkie i kompletne.

Powiązane problemy