Es gibt zwei Möglichkeiten, dies zu beheben:
Führen Sie in der MySQL-Konsole Folgendes aus:
SET GLOBAL log_bin_trust_function_creators = 1;
Fügen Sie der Konfigurationsdatei mysql.ini Folgendes hinzu:
log_bin_trust_function_creators = 1;
Die Einstellung lockert die Überprüfung auf nicht deterministische Funktionen. Nicht deterministische Funktionen sind Funktionen, die Daten ändern (dh Anweisungen aktualisieren, einfügen oder löschen). Weitere Informationen finden Sie hier .
Bitte beachten Sie, dass diese Einstellung nicht gilt, wenn die binäre Protokollierung NICHT aktiviert ist.
Binäre Protokollierung gespeicherter Programme
Wenn die binäre Protokollierung nicht aktiviert ist, gilt log_bin_trust_function_creators nicht.
log_bin_trust_function_creators
Diese Variable gilt, wenn die binäre Protokollierung aktiviert ist.
Der beste Ansatz ist ein besseres Verständnis und eine bessere Verwendung deterministischer Deklarationen für gespeicherte Funktionen. Diese Deklarationen werden von MySQL verwendet, um die Replikation zu optimieren, und es ist eine gute Sache, sie sorgfältig auszuwählen, um eine fehlerfreie Replikation zu erzielen.
DETERMINISTISCH
Eine Routine gilt als „deterministisch“, wenn sie immer das gleiche Ergebnis für die gleichen Eingabeparameter liefert und ansonsten NICHT DETERMINISTISCH. Dies wird hauptsächlich bei der Verarbeitung von Zeichenfolgen oder Mathematik verwendet, ist jedoch nicht darauf beschränkt.
NICHT DETERMINISTISCH
Gegenüber "DETERMINISTISCH". " Wenn in der Routinedefinition weder DETERMINISTIC noch NOT DETERMINISTIC angegeben ist, lautet der Standardwert NICHT DETERMINISTIC. Um zu deklarieren, dass eine Funktion deterministisch ist, müssen Sie DETERMINISTIC explizit angeben. " Wenn also keine Aussage gemacht wird, wird MySQl die Funktion als "NICHT DETERMINISTISCH" behandeln. Diese Aussage aus dem Handbuch steht im Widerspruch zu anderen Aussagen aus einem anderen Bereich des Handbuchs, in denen es heißt: "Wenn Sie eine gespeicherte Funktion erstellen, müssen Sie entweder deklarieren, dass sie deterministisch ist oder keine Daten ändert. Andernfalls ist die Datenwiederherstellung oder -replikation möglicherweise nicht sicher. Standardmäßig muss mindestens eine der Anweisungen DETERMINISTIC, NO SQL oder READS SQL DATA explizit angegeben werden, damit eine CREATE FUNCTION-Anweisung akzeptiert wird. Andernfalls tritt ein Fehler auf "
Ich persönlich habe in MySQL 5.5 einen Fehler erhalten, wenn es keine Deklaration gibt, daher habe ich immer mindestens eine Deklaration von "DETERMINISTIC", "NOT DETERMINISTIC", "NO SQL" oder "READS SQL DATA" eingefügt, unabhängig von anderen Deklarationen, die ich möglicherweise habe.
LESEN VON SQL-DATEN
Dies teilt MySQL ausdrücklich mit, dass die Funktion NUR Daten aus Datenbanken liest. Sie enthält daher keine Anweisungen zum Ändern von Daten, sondern SQL-Anweisungen zum Lesen von Daten (eq SELECT).
MODIFIES SQL DATA
Dies zeigt an, dass die Routine Anweisungen enthält, die Daten schreiben können (z. B. Anweisungen UPDATE, INSERT, DELETE oder ALTER).
NO SQL
Dies zeigt an, dass die Routine keine SQL-Anweisungen enthält.
CONTAINS SQL
Dies gibt an, dass die Routine SQL-Anweisungen enthält, jedoch keine Anweisungen zum Lesen oder Schreiben von Daten. Dies ist die Standardeinstellung, wenn keine dieser Eigenschaften explizit angegeben wird. Beispiele für solche Anweisungen sind SELECT NOW (), SELECT 10 + @ b, SET @x = 1 oder DO RELEASE_LOCK ('abc'), die Daten ausführen, aber weder lesen noch schreiben.
Beachten Sie, dass es MySQL-Funktionen gibt, die nicht deterministisch sicher sind, wie z. B. NOW (), UUID () usw., die auf verschiedenen Computern wahrscheinlich unterschiedliche Ergebnisse liefern. Daher muss eine Benutzerfunktion, die solche Anweisungen enthält, als NOT DETERMINISTIC deklariert werden . Außerdem ist eine Funktion, die Daten aus einem nicht replizierten Schema liest, eindeutig NONDETERMINISTISCH. * *
Die Bewertung der Art einer Routine basiert auf der „Ehrlichkeit“ des Erstellers: MySQL überprüft nicht, ob eine als DETERMINISTIC deklarierte Routine frei von Aussagen ist, die nicht deterministische Ergebnisse liefern. Eine falsche Deklaration einer Routine kann jedoch die Ergebnisse oder die Leistung beeinträchtigen. Das Deklarieren einer nichtdeterministischen Routine als DETERMINISTIC kann zu unerwarteten Ergebnissen führen, indem das Optimierungsprogramm falsche Ausführungsplanentscheidungen trifft. Das Deklarieren einer deterministischen Routine als NONDETERMINISTIC kann die Leistung beeinträchtigen, da verfügbare Optimierungen nicht verwendet werden.
Wenn Sie eine gespeicherte Funktion erstellen, müssen Sie entweder deklarieren, dass sie deterministisch ist oder keine Daten ändert. Andernfalls ist die Datenwiederherstellung oder -replikation möglicherweise nicht sicher.
Standardmäßig muss mindestens eine der Anweisungen DETERMINISTIC, NO SQL oder READS SQL DATA explizit angegeben werden, damit eine CREATE FUNCTION-Anweisung akzeptiert wird. Andernfalls tritt ein Fehler auf:
Um dieses Problem zu beheben, fügen Sie die folgenden Zeilen hinzu: After Return und Before Begin-Anweisung:
Zum Beispiel :
Weitere Informationen zu diesem Problem finden Sie hier
quelle
READS SQL DATA
die am wenigsten einschränkende der drei ist. Wenn Ihre Funktion in die KategorieNO SQL
oder fälltDETERMINISTIC
, können Sie die Leistung verbessern, indem Sie Ihre Funktionen ändern. Andererseits ist die EinstellungREADS SQL DATA
auch am wenigsten fehleranfällig. Wenn Sie also falsch verwendenNO SQL
oderDETERMINISTIC
falsche Ergebnisse erhalten.folgenden Donalds Kommentar:
Alles was ich tun musste war:
Dieser Schritt aus dem Importproblem heraus.
(Dann werde ich den Code des Programmierers überprüfen, um eine Verbesserung vorzuschlagen.)
quelle
Wenn Ihre Funktion deterministisch ist, können Sie sie mit Sicherheit als deterministisch deklarieren. Die Position des Schlüsselworts "DETERMINISTIC" lautet wie folgt.
quelle
Unter Windows 10
Ich habe dieses Problem gerade wie folgt gelöst.
Gehen Sie zu my.ini und fügen Sie diese 2 Zeilen unter [mysqld] hinzu.
Starten Sie den MySQL-Dienst neu
quelle
Got fatal error 1236 from master when reading data from binary log: 'Binary log is not open'
Versuchen Sie den Definer für die Funktion einzustellen!
Also statt
CREATE FUNCTION get_pet_owner
Sie werden etwas Ähnliches schreiben
CREATE DEFINER=
procadmin
@%
FUNCTION get_pet_ownerDies sollte funktionieren, wenn der Benutzer prodacmin Rechte zum Erstellen von Funktionen / Prozeduren hat.
In meinem Fall funktionierte die Funktion beim Generieren über MySQL Workbench, aber nicht, wenn sie direkt als SQL-Skript ausgeführt wurde. Durch die obigen Änderungen wurde das Problem behoben.
quelle