DETERMINISTIC, NO SQL lub READS SQL DATA w deklaracji i rejestrowanie binarne jest włączone

107

Podczas importu bazy danych w mysql otrzymałem następujący błąd:

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)

Nie wiem, co muszę zmienić. Czy ktoś może mi pomóc, jak to rozwiązać?

ASR
źródło

Odpowiedzi:

237

Istnieją dwa sposoby, aby to naprawić:

  1. Wykonaj następujące czynności w konsoli MySQL:

    SET GLOBAL log_bin_trust_function_creators = 1;

  2. Dodaj następujące elementy do pliku konfiguracyjnego mysql.ini:

    log_bin_trust_function_creators = 1;

To ustawienie rozluźnia sprawdzanie funkcji niedeterministycznych. Funkcje niedeterministyczne to funkcje, które modyfikują dane (tj. Mają instrukcje aktualizacji, wstawiania lub usuwania). Więcej informacji można znaleźć tutaj .

Należy pamiętać, że jeśli rejestrowanie binarne NIE jest włączone, to ustawienie nie ma zastosowania.

Rejestrowanie binarne programów przechowywanych

Jeśli rejestrowanie binarne nie jest włączone, log_bin_trust_function_creators nie ma zastosowania.

log_bin_trust_function_creators

Ta zmienna ma zastosowanie, gdy jest włączone rejestrowanie binarne.

Najlepszym podejściem jest lepsze zrozumienie i użycie deterministycznych deklaracji dla funkcji przechowywanych. Te deklaracje są używane przez MySQL do optymalizacji replikacji i dobrze jest je wybrać ostrożnie, aby zapewnić prawidłową replikację.

DETERMINISTYCZNA Procedura jest uważana za „deterministyczną”, jeśli zawsze daje ten sam wynik dla tych samych parametrów wejściowych, a NIE DETERMINISTYCZNA w innym przypadku. Jest to głównie używane do przetwarzania ciągów lub matematyki, ale nie ogranicza się do tego.

NOT DETERMINISTIC Przeciwieństwo „DETERMINISTIC”. „ Jeśli w definicji procedury nie podano ani DETERMINISTIC, ani NOT DETERMINISTIC, wartością domyślną jest NOT DETERMINISTIC. Aby zadeklarować, że funkcja jest deterministyczna, należy wyraźnie określić DETERMINISTIC. ”. Wydaje się więc, że jeśli nie zostanie podane żadne polecenie, MySQl potraktuje funkcję jako „NIEDETERMINISTYCZNĄ”. To stwierdzenie z instrukcji jest sprzeczne z innym stwierdzeniem z innego obszaru instrukcji, które mówi, że: „Podczas tworzenia funkcji przechowywanej należy zadeklarować, że jest deterministyczna lub że nie modyfikuje danych. W przeciwnym razie odzyskanie lub replikacja danych może być niebezpieczne. Domyślnie, aby instrukcja CREATE FUNCTION została zaakceptowana, należy jawnie określić co najmniej jedną z opcji: DETERMINISTIC, NO SQL lub READS SQL DATA. W przeciwnym razie wystąpi błąd

Osobiście otrzymałem błąd w MySQL 5.5, jeśli nie ma deklaracji, więc zawsze umieszczam co najmniej jedną deklarację „DETERMINISTIC”, „NOT DETERMINISTIC”, „NO SQL” lub „READS SQL DATA”, niezależnie od innych deklaracji, które mogę mieć.

CZYTA DANE SQL To wyraźnie mówi MySQL, że funkcja będzie odczytywać TYLKO dane z baz danych, a zatem nie zawiera instrukcji modyfikujących dane, ale zawiera instrukcje SQL, które odczytują dane (np. SELECT).

MODIFIES SQL DATA Oznacza to, że procedura zawiera instrukcje, które mogą zapisywać dane (na przykład zawiera instrukcje UPDATE, INSERT, DELETE lub ALTER).

NO SQL Oznacza to, że procedura nie zawiera instrukcji SQL.

CONTAINS SQL Wskazuje, że procedura zawiera instrukcje SQL, ale nie zawiera instrukcji odczytujących lub zapisujących dane. Jest to ustawienie domyślne, jeśli żadna z tych cech nie jest podana jawnie. Przykładami takich instrukcji są SELECT NOW (), SELECT 10 + @ b, SET @x = 1 lub DO RELEASE_LOCK ('abc'), które wykonują się, ale nie odczytują ani nie zapisują danych.

Zauważ, że istnieją funkcje MySQL, które nie są deterministycznie bezpieczne, takie jak: NOW (), UUID () itp., Które mogą powodować różne wyniki na różnych maszynach, więc funkcja użytkownika, która zawiera takie instrukcje, musi być zadeklarowana jako NIEDETERMINISTYCZNA . Ponadto funkcja, która odczytuje dane z niereplikowanego schematu, jest wyraźnie NONDETERMINISTYCZNA. *

Ocena natury procedury opiera się na „uczciwości” twórcy: MySQL nie sprawdza, czy procedura zadeklarowana jako DETERMINISTIC jest wolna od stwierdzeń, które dają wyniki niedeterministyczne. Jednak błędne zadeklarowanie rutyny może wpłynąć na wyniki lub wpłynąć na wydajność. Zadeklarowanie niedeterministycznej procedury jako DETERMINISTIC może prowadzić do nieoczekiwanych rezultatów, powodując, że optymalizator dokona nieprawidłowych wyborów planu wykonania. Zadeklarowanie deterministycznej procedury jako NONDETERMINISTIC może obniżyć wydajność, powodując, że dostępne optymalizacje nie będą używane.

Donal
źródło
czy możesz mi wyjaśnić, co się stało w tle?
ASR
2
Podejrzewam, że baza danych ma funkcję modyfikującą dane (zawiera instrukcję aktualizacji, wstawiania lub usuwania). Aby uzyskać więcej informacji, zobacz tutaj: dev.mysql.com/doc/refman/5.0/en/stored-programs-logging.html
Donal
1
Zawsze powinieneś robić kopie zapasowe
Donal
potrzebuje super przywilejów!
Felipe Morales
próbowałeś tego, ale nadal masz niedeterministyczny problem, jakąś inną sugestię? dzięki
Edwin Bermejo
40
  • Podczas tworzenia funkcji przechowywanej należy zadeklarować, że jest deterministyczna lub nie modyfikuje danych. W przeciwnym razie odzyskanie lub replikacja danych może być niebezpieczne.

  • Domyślnie, aby instrukcja CREATE FUNCTION została zaakceptowana, należy jawnie określić co najmniej jedną z opcji: DETERMINISTIC, NO SQL lub READS SQL DATA. W przeciwnym razie wystąpi błąd:

Aby rozwiązać ten problem, dodaj następujące wiersze po instrukcji Return i Before Begin:

READS SQL DATA
DETERMINISTIC

Na przykład :

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

Aby uzyskać więcej informacji na temat tego problemu, przeczytaj tutaj

Sunny SM
źródło
To działa, ponieważ ustawienie READS SQL DATAjest najmniej restrykcyjne z trzech. Jeśli funkcja należy do kategorii NO SQLlub DETERMINISTIC, możesz poprawić wydajność, modyfikując funkcje. Z drugiej strony ustawienie READS SQL DATAjest również najmniej podatne na błędy. Więc jeśli nieprawidłowo użyjesz NO SQLlub DETERMINISTICmożesz uzyskać nieprawidłowe wyniki.
Jonathan
@ SunnyS.M, Niesamowite wyjaśnienie, takie jak READS SQL DATA DETERMINISTIC.Aby naprawić ten problem, dodaj następujące wiersze po wyrażeniu Return i Before Begin:
Md Haidar Ali Khan
4

po komentarzu Donalda:

Ta zmienna ma zastosowanie, gdy jest włączone rejestrowanie binarne.

Wszystko, co musiałem zrobić, to:

  1. wyłączone log_bin w my.cnf (#log_bin)
  2. zrestartuj mysql
  3. import DB
  4. włącz log_bin
  5. zrestartuj mysql

To rozwiązuje ten problem z importem.

(Następnie przejrzę kod programisty, aby zasugerować poprawę)

Mayra Navarro
źródło
3

Gdy twoja funkcja jest deterministyczna, możesz bezpiecznie zadeklarować, że jest deterministyczna. Lokalizacja słowa kluczowego „DETERMINISTIC” jest następująca.

wprowadź opis obrazu tutaj

Park JongBum
źródło
2

W systemie Windows 10

Właśnie rozwiązałem ten problem, wykonując następujące czynności.

  1. Przejdź do my.ini i dodaj te 2 wiersze pod [mysqld]

    skip-log-bin
    log_bin_trust_function_creators = 1
  2. zrestartuj usługę MySQL

Preetham
źródło
po zrobieniu tego otrzymałem błąd w niewolniku -Got fatal error 1236 from master when reading data from binary log: 'Binary log is not open'
Ramratan Gupta
0

Spróbuj ustawić definicję funkcji!

Więc zamiast

CREATE FUNCTION get_pet_owner

napiszesz coś podobnego

CREATE DEFINER=procadmin@% FUNCTION get_pet_owner

które powinno działać, jeśli użytkownik prodacmin ma uprawnienia do tworzenia funkcji / procedur.

W moim przypadku funkcja działała, gdy została wygenerowana przez MySQL Workbench, ale nie działała, gdy została uruchomiona bezpośrednio jako skrypt SQL. Wprowadzenie powyższych zmian rozwiązało problem.

DevKingKev
źródło