Mysql
 sql >> Datenbank >  >> RDS >> Mysql

DETERMINISTIC, NO SQL oder READS SQL DATA in seiner Deklaration und die binäre Protokollierung ist aktiviert

Es gibt zwei Möglichkeiten, dies zu beheben:

  1. Führen Sie in der MySQL-Konsole Folgendes aus:

    SET GLOBAL log_bin_trust_function_creators = 1;

  2. Fügen Sie der mysql.ini-Konfigurationsdatei Folgendes hinzu:

    log_bin_trust_function_creators = 1;

Die Einstellung lockert die Prüfung auf nicht deterministische Funktionen. Nicht deterministische Funktionen sind Funktionen, die Daten modifizieren (d. h. Anweisungen zum Aktualisieren, Einfügen oder Löschen haben). 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

log_bin_trust_function_creators

Der beste Ansatz ist ein besseres Verständnis und eine bessere Verwendung von deterministischen Deklarationen für gespeicherte Funktionen. Diese Deklarationen werden von MySQL verwendet, um die Replikation zu optimieren, und es ist gut, sie sorgfältig auszuwählen, um eine gesunde Replikation zu haben.

DETERMINISTISCH Eine Routine wird als „deterministisch“ betrachtet, 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 mathematischen Verfahren verwendet, ist aber nicht darauf beschränkt.

NICHT DETERMINISTISCH Gegenteil von "DETERMINISTIC".Wenn weder DETERMINISTIC noch NOT DETERMINISTIC in der Routinendefinition angegeben ist, ist die Standardeinstellung NOT DETERMINISTIC. Um zu erklären, dass eine Funktion deterministisch ist, müssen Sie DETERMINISTIC explizit angeben. ".So scheint es, dass MySQl die Funktion als "NOT DETERMINISTIC" behandeln wird, wenn keine Aussage gemacht wird." gespeicherte Funktion, müssen Sie entweder deklarieren, dass sie deterministisch ist oder dass sie keine Daten ändert. Andernfalls kann dies für die Datenwiederherstellung oder -replikation unsicher sein. Damit eine CREATE FUNCTION-Anweisung akzeptiert wird, muss standardmäßig mindestens eines von DETERMINISTIC, NO SQL oder READS SQL DATA explizit angegeben werden. Andernfalls tritt ein Fehler auf "

Ich persönlich habe einen Fehler in MySQL 5.5 erhalten, wenn es keine Deklaration gibt, also setze ich immer mindestens eine Deklaration von "DETERMINISTIC", "NOT DETERMINISTIC", "NO SQL" oder "READS SQL DATA", unabhängig von anderen Deklarationen, die ich haben kann.

LIEST SQL-DATEN Dies teilt MySQL explizit mit, dass die Funktion NUR Daten aus Datenbanken lesen wird, daher enthält sie keine Anweisungen, die Daten ändern, aber sie enthält SQL-Anweisungen, die Daten lesen (z. B. SELECT).

ÄNDERT SQL-DATEN Dies weist darauf hin, dass die Routine Anweisungen enthält, die Daten schreiben können (z. B. UPDATE-, INSERT-, DELETE- oder ALTER-Anweisungen).

KEIN SQL Dies zeigt an, dass die Routine keine SQL-Anweisungen enthält.

ENTHÄLT SQL Dies zeigt an, dass die Routine SQL-Anweisungen enthält, aber keine Anweisungen, die Daten lesen oder schreiben. Dies ist die Voreinstellung, wenn keines dieser Merkmale explizit angegeben ist. Beispiele für solche Anweisungen sind SELECT NOW(), SELECT [email protected] , SET @x =1 oder DO RELEASE_LOCK('abc'), die ausführen, aber weder Daten lesen noch schreiben.

Beachten Sie, dass es MySQL-Funktionen gibt, die nicht deterministisch sicher sind, wie z. B.:NOW(), UUID() usw., die wahrscheinlich auf verschiedenen Computern unterschiedliche Ergebnisse liefern. Daher muss eine Benutzerfunktion, die solche Anweisungen enthält, als NOT DETERMINISTIC deklariert werden .Auch eine Funktion, die Daten aus einem nicht replizierten Schema liest, ist eindeutig NONDETERMINISTIC.*