Warum wird eine MySQL-Funktion zufällig gelöscht?

2

Ich habe die folgende Funktion, die in mehreren Datenbanken auf meinem Server verwendet wird.

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;

In regelmäßigen Abständen und auf nicht vorhersehbare Weise wird die Funktion in allen Datenbanken abgelegt.

Gibt es etwas an der Funktion oder möglicherweise an meiner MySQL-Konfiguration, das dazu führen würde / könnte, dass diese Funktion gelöscht wird?

Darrell Brogdon
quelle
1
Ich sehe nichts offensichtlich Verdächtiges, aber aus diesem Grund habe ich vorgeschlagen, Dummy-Funktionen auszuprobieren. Wenn eine Funktion mit demselben Inhalt, aber unterschiedlichem Namen gelöscht wird, wissen Sie, dass der Inhalt etwas enthält, und können versuchen, Teile davon zu entfernen, um genau einzugrenzen, was das Problem auslöst. Wenn eine Dummy-Funktion mit demselben Namen, aber unterschiedlichen Inhalten gelöscht wird, wird sie nach Namen gelöscht. Ist die tatsächliche Funktion genau wie oben oder enthält sie Kommentare?
Synetech
2
Stellen Sie regelmäßig eine Sicherung der MySQL-Datenbank wieder her?
RolandoMySQLDBA
1
Könnte es sein, dass die Funktion eine Ausnahme verursacht? Der zufällige Teil wären einige seltsame Parameter, die Sie nicht vorausgesehen haben. Möglicherweise fügen Sie eine Fehlerbehandlungsroutine hinzu.
harrymc
1
Ich weiß es nicht, aber da die Funktion harmlos aussieht, könnte ein Problem während der Ausführung der Grund für das Problem sein.
harrymc
1
Das OP sagt: "Es ist die einzige Funktion, die ich habe." Außerdem wird (anscheinend) eine Funktion mit dem gleichen Inhalt, aber einem anderen Namen gelöscht. @ DarrellBrogdon: hast du eine Dummy-Funktion mit ausprobiert anders Inhalt (z. B. keiner) und ein anderer Name? Vielleicht liegt das Problem daran irgendein Funktion wird gelöscht.
Scott

Antworten:

4

Verwenden Sie zufällig --skip-grant-tables beim Start Ihres Daemons?

Aus der Dokumentation zu CREATE FUNCTION

Eine aktive Funktion wurde mit CREATE FUNCTION geladen und nicht mit DROP FUNCTION entfernt. Alle aktiven Funktionen werden bei jedem Serverstart neu geladen. es sei denn, Sie starten mysqld mit der Option --skip-grant-tables .

Noishe
quelle
Es scheint nicht, dass MySQL mit diesem Schalter gestartet wurde: mysql 6428 0.5 14.2 1382020 293176 ? Ssl 2013 154:25 /usr/sbin/mysqld Dies ist auf Ubuntu 12.04.3 LTS mit Lager MySQL, glaube ich. Solange MySQL auf Ubuntu nicht über --skip-grant-tables verfügt, sollte dieses Flag nicht aktiviert sein.
Darrell Brogdon
2

Die Funktion scheint auf den ersten Blick harmlos genug, aber ich frage mich, was passieren würde, wenn es hat während der Ausführung eine Ausnahme verursacht. Ich kenne MySQL nicht gut genug, um vorherzusagen, was es tun wird - Soweit ich weiß, wird die Funktion möglicherweise gelöscht oder deaktiviert.

Der zufällige Teil dafür, wenn dies passiert, wären einige seltsame und seltene Parameter dass Sie nicht vorausgesehen haben, dass dies die Ausnahme verursacht.

Sie können eine leere Funktion mit demselben Namen testen. Wenn diese Funktion das Problem nicht anzeigt, kann dies möglicherweise darauf hinweisen Es liegt ein Laufzeitproblem vor.

Ein zweiter Test wäre, der Funktion eine Fehlerbehandlungsroutine hinzuzufügen, um festzustellen, ob das Problem vorliegt wird dann verschwinden.

harrymc
quelle