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.