Eu tenho a seguinte função que é usada em vários bancos de dados no meu servidor.
CREATE FUNCTION `fn_strings_intersect`(arg_str1 VARCHAR(255), arg_str2 VARCHAR(255)) RETURNS varchar(255) CHARSET latin1
BEGIN
SET arg_str1 = CONCAT(arg_str1, ",");
SET @var_result = "";
WHILE(INSTR(arg_str1, ",") > 0)
DO
SET @var_val = SUBSTRING_INDEX(arg_str1, ",", 1);
SET arg_str1 = SUBSTRING(arg_str1, INSTR(arg_str1, ",") + 1);
IF(FIND_IN_SET(replace(@var_val, ' ', ''), arg_str2) > 0)
THEN
SET @var_result = CONCAT(@var_result, @var_val, ",");
END IF;
END WHILE;
IF (@var_result = "")
THEN
RETURN false;
ELSE
RETURN true;
END IF;
END;
Periodicamente, e de maneira não previsível, a função está sendo descartada em todos os bancos de dados.
Existe alguma coisa sobre a função ou possivelmente minha configuração do MySQL que poderia / poderia causar essa função get get dropped?
Respostas:
Por acaso, você está usando --skip-grant-tables em sua inicialização do daemon?
Da documentação para CREATE FUNCTION
fonte
mysql 6428 0.5 14.2 1382020 293176 ? Ssl 2013 154:25 /usr/sbin/mysqld
Isso é no Ubuntu 12.04.3 LTS com o estoque MySQL eu acredito. Então, a menos que o arquivo MySQL no Ubuntu venha com --skip-grant-tables ele não deveria ter o sinalizador habilitado.A função parece inofensiva o suficiente à primeira vista, mas eu me pergunto o que aconteceria se causou uma exceção durante a execução. Eu não sei o MySQL bem o suficiente para prever o que ele fará - por tudo que eu sei que pode derrubar ou desabilitar a função.
A parte aleatória para quando isso acontece seria alguns parâmetros estranhos e raros que você não previu que causa a exceção.
Você poderia testar uma função vazia com o mesmo nome. Se esta função não mostrar o problema, isso pode indicar que existe um problema de tempo de execução.
Um segundo teste seria adicionar um manipulador de erro à função para ver se o problema então desaparecerá.
fonte