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 fazer com que essa função fosse descartada?

    
por Darrell Brogdon 06.01.2014 / 21:42

2 respostas

4

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

Da documentação para CREATE FUNCTION

An active function is one that has been loaded with CREATE FUNCTION and not removed with DROP FUNCTION. All active functions are reloaded each time the server starts, unless you start mysqld with the --skip-grant-tables option.

    
por 10.01.2014 / 11:45
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 conheço o MySQL bem o suficiente para prever o que ele fará - por tudo que eu sei, pode derrubar ou desabilitar a função.

A parte aleatória para quando isso acontece seriam alguns parâmetros estranhos e raros que você não previu que causa a exceção.

Você pode 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 em tempo de execução.

Um segundo teste seria adicionar um manipulador de erro à função para ver se o problema então desaparecerá.

    
por 15.01.2014 / 17:08

Tags