Por que uma função MySQL estaria sendo descartada aleatoriamente?

2

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?

Darrell Brogdon
fonte
1
Eu não vejo nada obviamente suspeito, mas é por isso que eu sugeri tentar funções falsas. Se uma função com o mesmo conteúdo, mas um nome diferente, for ignorada, você sabe que há algo sobre o conteúdo e pode tentar remover partes dela para restringir exatamente o que está provocando o problema. Se uma função fictícia com o mesmo nome, mas conteúdo diferente, for ignorada, então algo está caindo pelo nome. A função real é exatamente como acima ou inclui comentários?
Synetech
2
Você está restaurando um backup do banco de dados mysql periodicamente?
RolandoMySQLDBA
1
Será que a função causa uma exceção? A parte aleatória seria alguns parâmetros estranhos que você não previu. Você pode adicionar um manipulador de erros.
harrymc
1
Eu não sei, mas como a função parece inofensiva, um problema durante a execução pode ser o motivo do problema.
harrymc
1
O OP diz: "É a única função que tenho." Também (aparentemente) uma função com o mesmo conteúdo, mas o nome diferente também é descartado. @DarrellBrogdon: você já tentou uma função fictícia com diferente conteúdo (por exemplo, nenhum) e um nome diferente? Talvez o problema seja que qualquer a função cai.
Scott

Respostas:

4

Por acaso, você está usando --skip-grant-tables em sua inicialização do daemon?

Da documentação para CREATE FUNCTION

Uma função ativa é aquela que foi carregada com CREATE FUNCTION e não removida com DROP FUNCTION. Todas as funções ativas são recarregadas sempre que o servidor é iniciado a menos que você inicie o mysqld com a opção --skip-grant-tables .

Noishe
fonte
Não parece que o mysql foi iniciado com esse switch: 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.
Darrell Brogdon
2

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á.

harrymc
fonte