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


107

Durante l'importazione del database in mysql, ho ricevuto il seguente errore:

1418 (HY000) at line 10185: This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators variable)

Non so quali cose devo cambiare. Qualcuno può aiutarmi a risolvere questo problema?

Risposte:


237

Ci sono due modi per risolvere questo problema:

  1. Esegui quanto segue nella console MySQL:

    SET GLOBAL log_bin_trust_function_creators = 1;

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


mi spieghi cosa è successo in background?
ASR

2
Sospetto che il database abbia una funzione che modifica i dati (contiene un'istruzione di aggiornamento, inserimento o eliminazione). Per maggiori informazioni, vedere qui: dev.mysql.com/doc/refman/5.0/en/stored-programs-logging.html
Donal

1
Dovresti sempre fare dei backup
Donal

ha bisogno di super privilegi!
Felipe Morales

provato questo ma ho ancora il problema non deterministico, qualche altro suggerimento? grazie
Edwin Bermejo

40
  • 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:

Per risolvere questo problema, aggiungi le seguenti righe After Return e Before Begin:

READS SQL DATA
DETERMINISTIC

Per esempio :

CREATE FUNCTION f2()
RETURNS CHAR(36) CHARACTER SET utf8
/*ADD HERE */
READS SQL DATA
DETERMINISTIC
BEGIN

Per maggiori dettagli su questo problema, leggi qui


Funziona perché l'impostazione READS SQL DATAè la meno restrittiva delle tre. Se la tua funzione rientra nella categoria NO SQLo DETERMINISTIC, puoi migliorare le prestazioni modificando le tue funzioni. D'altra parte, l'impostazione READS SQL DATAè anche la meno soggetta a errori. Quindi se usi in modo errato NO SQLo DETERMINISTICpotresti ottenere risultati errati.
Jonathan

@ SunnyS.M, spiegazione impressionante come READS SQL DATA DETERMINISTIC.Per risolvere questo problema, aggiungi le seguenti righe After Return e Before Begin:
Md Haidar Ali Khan

4

seguendo il commento di Donald:

Questa variabile si applica quando la registrazione binaria è abilitata.

Tutto quello che dovevo fare era:

  1. log_bin disabilitato in my.cnf (#log_bin)
  2. riavvia mysql
  3. importare DB
  4. abilita log_bin
  5. riavvia mysql

Quel passaggio risolve il problema dell'importazione.

(Quindi rivedrò il codice del programmatore per suggerire un miglioramento)


3

Quando la tua funzione è deterministica, puoi tranquillamente dichiararla deterministica. La posizione della parola chiave "DETERMINISTIC" è la seguente.

inserisci qui la descrizione dell'immagine


2

Su Windows 10,

Ho appena risolto questo problema procedendo come segue.

  1. Vai a my.ini e aggiungi queste 2 righe in [mysqld]

    skip-log-bin
    log_bin_trust_function_creators = 1
  2. riavviare il servizio MySQL


dopo averlo fatto, ho ricevuto un errore sullo slave -Got fatal error 1236 from master when reading data from binary log: 'Binary log is not open'
Ramratan Gupta

0

Prova a impostare il definitore per la funzione!

Quindi invece di

CREATE FUNCTION get_pet_owner

scriverai qualcosa di simile

CREATE DEFINER=procadmin@% FUNCTION get_pet_owner

che dovrebbe funzionare se l'utente prodacmin ha i diritti per creare funzioni / procedure.

Nel mio caso la funzione ha funzionato quando generata tramite MySQL Workbench ma non ha funzionato se eseguita direttamente come script SQL. Apportare le modifiche sopra ha risolto il problema.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.