Ci sono due modi per risolvere questo problema:
Esegui quanto segue nella console MySQL:
SET GLOBAL log_bin_trust_function_creators = 1;
Aggiungere 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 (ovvero dispongono di istruzioni di aggiornamento, inserimento o cancellazione). Per ulteriori informazioni, vedere qui .
Tieni presente che se la registrazione binaria NON è abilitata, questa impostazione non si applica.
Registrazione binaria dei programmi memorizzati
Se la registrazione binaria non è abilitata, log_bin_trust_function_creators non si applica.
log_bin_trust_function_creators
Questa variabile si applica quando la registrazione binaria è abilitata.
L'approccio migliore è una migliore comprensione e utilizzo delle dichiarazioni deterministiche per le funzioni archiviate. Queste dichiarazioni sono usate da MySQL per ottimizzare la replica ed è bene sceglierle con attenzione per avere una replica sana.
DETERMINISTICA
Una routine è considerata “deterministica” se produce sempre lo stesso risultato per gli stessi parametri di input e NON DETERMINISTICA in caso contrario. Viene utilizzato principalmente con l'elaborazione di stringhe o matematica, ma non limitato a questo.
NON DETERMINISTICO
Opposto di "DETERMINISTICO". " Se né DETERMINISTIC né NOT DETERMINISTIC è fornito nella definizione di routine, il valore predefinito è NOT DETERMINISTIC. Per dichiarare che una funzione è deterministica, è necessario specificare DETERMINISTIC esplicitamente. ". Quindi sembra che se non viene fatta alcuna dichiarazione, 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 si crea una 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 esplicitamente almeno uno tra DETERMINISTIC, NO SQL o READS SQL DATA. Altrimenti si verifica un errore "
Personalmente ho ricevuto un errore in MySQL 5.5 se non ci sono dichiarazioni, quindi ho sempre messo almeno una dichiarazione di "DETERMINISTIC", "NOT DETERMINISTIC", "NO SQL" o "READS SQL DATA" indipendentemente dalle altre dichiarazioni che potrei avere.
READS SQL DATA
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 (eq SELECT).
MODIFIES SQL DATA
Indica che la routine contiene istruzioni che possono scrivere dati (ad esempio, contiene istruzioni UPDATE, INSERT, DELETE o ALTER).
NO SQL
Ciò indica che la routine non contiene istruzioni SQL.
CONTAINS SQL
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 viene fornita esplicitamente. Esempi di tali istruzioni sono SELECT NOW (), SELECT 10 + @ b, SET @x = 1 o DO RELEASE_LOCK ('abc'), che vengono eseguiti ma non leggono né scrivono dati.
Nota che ci sono funzioni MySQL che non sono deterministiche sicure, come: NOW (), UUID (), ecc., Che potrebbero 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. *
La valutazione della natura di una routine si basa sull '"onestà" del creatore: MySQL non controlla che una routine dichiarata DETERMINISTIC sia priva di affermazioni che producono risultati non deterministici. Tuttavia, dichiarare erroneamente una routine potrebbe influire sui risultati o sulle prestazioni. Dichiarare una routine non deterministica come DETERMINISTICA potrebbe portare a risultati imprevisti facendo sì che l'ottimizzatore effettui scelte errate del piano di esecuzione. Dichiarare una routine deterministica come NON DETERMINISTICA potrebbe diminuire le prestazioni provocando il mancato utilizzo delle ottimizzazioni disponibili.