Ci sono due modi per risolvere questo problema:
-
Esegui quanto segue nella console MySQL:
SET GLOBAL log_bin_trust_function_creators = 1;
-
Aggiungi quanto segue al file di configurazione mysql.ini:
log_bin_trust_function_creators = 1;
L'impostazione rilassa il controllo delle funzioni non deterministiche. Le funzioni non deterministiche sono funzioni che modificano i dati (ad es. hanno istruzioni di aggiornamento, inserimento o eliminazione). Per ulteriori informazioni, vedere qui .
Tieni presente che se la registrazione binaria NON è abilitata, questa impostazione non si applica.
Registrazione binaria dei programmi archiviati
log_bin_trust_function_creators
L'approccio migliore è una migliore comprensione e utilizzo delle dichiarazioni deterministiche per le funzioni memorizzate. Queste dichiarazioni vengono utilizzate da MySQL per ottimizzare la replica ed è una buona cosa sceglierle con cura per avere una replica sana.
DETERMINISTICO Una routine è considerata "deterministica" se produce sempre lo stesso risultato per gli stessi parametri di input e NON DETERMINISTICA in caso contrario. Viene utilizzata principalmente con l'elaborazione di stringhe o matematica, ma non solo.
NON DETERMINISTICO Contrario di "DETERMINISTIC"."Se nella definizione della routine non vengono forniti né DETERMINISTIC né NOT DETERMINISTIC, l'impostazione predefinita è NOT DETERMINISTIC. Per dichiarare che una funzione è deterministica, è necessario specificare DETERMINISTIC in modo esplicito. ".Quindi sembra che se non viene fatta alcuna affermazione, MySQl tratterà la funzione come "NON DETERMINISTICA". Questa affermazione del manuale è in contraddizione con un'altra affermazione di un'altra area del manuale che dice che:" Quando crei un funzione memorizzata, è necessario dichiarare che è deterministica o che non modifica i dati. In caso contrario, potrebbe non essere sicuro per il ripristino o la replica dei dati. Per impostazione predefinita, affinché un'istruzione CREATE FUNCTION venga accettata, è necessario specificare in modo esplicito almeno uno tra DETERMINISTIC, NO SQL o READS SQL DATA. In caso contrario si verifica un errore "
Personalmente ho ricevuto un errore in MySQL 5.5 se non c'è una dichiarazione, quindi ho sempre inserito almeno una dichiarazione di "DETERMINISTIC", "NOT DETERMINISTIC", "NO SQL" o "READS SQL DATA" indipendentemente dalle altre dichiarazioni che potrei avere.
LEGGE I DATI SQL Questo dice esplicitamente a MySQL che la funzione leggerà SOLO i dati dai database, quindi non contiene istruzioni che modificano i dati, ma contiene istruzioni SQL che leggono i dati (es. SELECT).
MODIFICA DATI SQL Ciò indica che la routine contiene istruzioni che possono scrivere dati (ad esempio, contiene istruzioni UPDATE, INSERT, DELETE o ALTER).
NESSUN SQL Ciò indica che la routine non contiene istruzioni SQL.
CONTIENE SQL Ciò indica che la routine contiene istruzioni SQL, ma non contiene istruzioni che leggono o scrivono dati. Questa è l'impostazione predefinita se nessuna di queste caratteristiche è specificata in modo esplicito. Esempi di tali istruzioni sono SELECT NOW(), SELECT [email protected] , SET @x =1 o DO RELEASE_LOCK('abc'), che eseguono ma non leggono né scrivono dati.
Si noti che ci sono funzioni MySQL che non sono sicure dal punto di vista deterministico, come:NOW(), UUID(), ecc., che possono produrre risultati diversi su macchine diverse, quindi una funzione utente che contiene tali istruzioni deve essere dichiarata come NON DETERMINISTICA .Inoltre, una funzione che legge i dati da uno schema non replicato è chiaramente NON DETERMINISTICA.*