Mysql
 sql >> Database >  >> RDS >> Mysql

DETERMINISTIC, NO SQL o READS SQL DATA nella sua dichiarazione e la registrazione binaria è abilitata

Ci sono due modi per risolvere questo problema:

  1. Esegui quanto segue nella console MySQL:

    SET GLOBAL log_bin_trust_function_creators = 1;

  2. 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.*