Вопрос: Почему функция MySQL будет случайно удаляться?


У меня есть следующая функция, которая используется в нескольких базах на моем сервере.

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;

Периодически, и не предсказуемым образом, функция распространяется по всем базам данных.

Есть ли что-то о функции или, возможно, моей конфигурации MySQL, которая могла бы / могла бы заставить эту функцию получить отбрасывание?


2
2018-01-06 20:42


Источник


Я не вижу ничего подозрительного, но именно поэтому я предложил попробовать фиктивные функции. Если функция с тем же содержимым, но отличается от имени, вы знаете, что есть что-то о содержимом, и вы можете попытаться удалить ее части, чтобы сузить то, что вызывает проблему. Если пустая функция с тем же именем, но с другим содержимым, будет сброшена, то что-то отбрасывает ее по имени. Является ли фактическая функция точно такой, как указано выше, или она содержит комментарии? - Synetech
Периодически восстанавливаете резервную копию базы данных mysql? - RolandoMySQLDBA
Может быть, функция вызывает исключение? Случайная часть будет некоторыми странными параметрами, которые вы не предвидели. Вы можете добавить обработчик ошибок. - harrymc
Я не знаю, но поскольку функция выглядит безобидной, причиной проблемы может быть проблема во время выполнения. - harrymc
OP говорит: «Это единственная функция, которая у меня есть». Также (по-видимому) функция с тем же содержимым, но другое имя также отбрасывается. @DarrellBrogdon: вы пробовали фиктивную функцию с другой содержимое (например, нет) и другое имя? Возможно, проблема в том, что Любые функция отбрасывается. - Scott


Ответы:


По какой-либо причине вы используете -skip-grant-tables при запуске вашего демона?

Из документации для CREATE FUNCTION

Активная функция - это функция, которая была загружена функцией CREATE FUNCTION и не удалена с помощью DROP FUNCTION. Все активные функции перезагружаются каждый раз, когда сервер запускается, если вы не запустите mysqld с опцией -skip-grant-tables,


4
2018-01-10 10:45



Не похоже, что mysql был запущен с этим коммутатором: mysql 6428 0.5 14.2 1382020 293176 ? Ssl 2013 154:25 /usr/sbin/mysqld  Это на Ubuntu 12.04.3 LTS с запасом MySQL, который я считаю. Поэтому, если в базе данных MySQL на Ubuntu нет --skip-grant-tables, он не должен иметь этот флаг. - Darrell Brogdon


Функция кажется на первый взгляд безвредной, но я действительно задаюсь вопросом, что произойдет, если это вызвало исключение во время выполнения. Я не очень хорошо знаю MySQL, чтобы предсказать, что он будет делать - для всех, кого я знаю, это может привести к потере или отключению функции.

Случайная часть, когда это произойдет, - это некоторые странные и редкие параметры что вы не предвидели, что вызывают исключение.

Вы можете проверить пустую функцию с тем же именем. Если эта функция не показывает проблему, это может указывать на то, что существует проблема времени выполнения.

Второй тест состоял бы в том, чтобы добавить обработчик ошибок в функцию, чтобы увидеть, если проблема затем исчезнет.


2
2018-01-15 16:08