2011-06-01 20 views
5

He cargado una función UDF en MySQL (sin haber seleccionado ningún DB en particular). Se utiliza para funcionar bien durante mi sesión, pero ahora me sale el error "ERROR 1305 (42000): currentdatabase.myfunction función no existe" cuando intento utilizar la función con la siguiente instrucción SQL:No se puede usar una función UDF de MySQL

select myfunction('aaa'); 

I intenté soltar la función y obtuve el mismo código de error:

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

si se selecciona un DB.

Otro código de error de otro modo:

ERROR 1046 (3D000): No database selected 

Así que decidió especificar de nuevo la función y me dieron el siguiente código de error:

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

Mi pregunta es: ¿cómo utilizar de nuevo mi función?

Gracias de antemano.

Nota: no hay problemas de espacio como ("seleccione myfunction ('aaa');") como se informa en varios otros sitios web.

+0

Estoy teniendo el mismo problema. Creo que el problema es que (al menos lo hice) eliminé la biblioteca .so compartida antes de abandonar la función o mientras mysqld todavía estaba ejecutándose. No sé cómo resolver esto, alguien? 'SELECT * FROM mysql.func' lista la función que quiero usar. – juanmirocks

Respuesta

1

Creo que el problema proviene de eliminar la biblioteca .so antes de soltar las funciones. El servidor sigue creyendo que tiene las funciones, ya que aparecen en el SELECT * FROM mysql.func pero, por supuesto, estas funciones fallan. De alguna manera, DROP no elimina simplemente las entradas de esta tabla, sino que también comprueba si se encuentran las bibliotecas, lo que hace que esto falle. CREATE supuestamente acaba de comprobar primero la tabla func que hace que este falle ...

La solución es restaurar la tabla func (func.MYI, func.MYD, archivos func.frm en virtud de su mysql datos/mysql) hasta el punto todo coincide

Afortunadamente tuve una copia de seguridad de estos archivos. De lo contrario, tendrá que hacer una copia de seguridad desde una nueva instalación de MySQL (puede instalar localmente un servidor nuevo para no eliminar el actual)

Conclusión: no elimine las bibliotecas .so antes de eliminar las funciones.

5

Recientemente he encontrado con este problema de mi mismo y que arme un post rápido sobre ella:

Cuando installing a UDF recently recibí un mensaje de error molesto, que no parecía querer irse. Eliminar la función antes de intentar eliminarlo no funcionó, así que utilicé el siguiente conjunto de comandos de escalamiento para intentar instalarlo en .

Pero volviendo al error por un momento:

bash > mysql -u user -p < installdb.sql 
Enter password: 
ERROR 1125 (HY000) at line 7: Function 'lib_mysqludf_ssdeep_info' already exists
Esto se puede resuelto muy simplemente con las siguientes opciones:

  1. Intento eliminar la función y vuelva a instalarlo
  2. eliminar la fila función desde el MySQL .tabla FUNC y luego volver a instalarlo
  3. Detener el servidor MySQL (después de la opción 2 tratar), se inicia de nuevo y vuelva a instalarlo

Desde mi prueba de que no es necesario tener copias de seguridad de los archivos de base de datos binarios como @jmcejuela sugiere en su respuesta.

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

+1

+1 2. eliminar la fila de la función de mysql.func, reiniciar el servidor y luego volver a crear la función funcionó para mí. – kfmfe04

-1

Tienes algunos de estos errores cuando se cambia a cabo (no dejar caer) .so la biblioteca antes de dejar caer la función (s).

Al reiniciar el servidor se eliminaron los mensajes de error, ya sea que las funciones se hayan eliminado o no. Mysqld solo miró la tabla mysql.func y las funciones cargadas del (nuevo) .so. Sé que reiniciar el servidor no siempre es una opción, pero si lo es, es rápido y completo.

Cuestiones relacionadas