Istnieją dwa sposoby, aby to naprawić:
Wykonaj następujące czynności w konsoli MySQL:
SET GLOBAL log_bin_trust_function_creators = 1;
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.
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:
Na przykład :
Aby uzyskać więcej informacji na temat tego problemu, przeczytaj tutaj
źródło
READS SQL DATA
jest najmniej restrykcyjne z trzech. Jeśli funkcja należy do kategoriiNO SQL
lubDETERMINISTIC
, możesz poprawić wydajność, modyfikując funkcje. Z drugiej strony ustawienieREADS SQL DATA
jest również najmniej podatne na błędy. Więc jeśli nieprawidłowo użyjeszNO SQL
lubDETERMINISTIC
możesz uzyskać nieprawidłowe wyniki.po komentarzu Donalda:
Wszystko, co musiałem zrobić, to:
To rozwiązuje ten problem z importem.
(Następnie przejrzę kod programisty, aby zasugerować poprawę)
źródło
Gdy twoja funkcja jest deterministyczna, możesz bezpiecznie zadeklarować, że jest deterministyczna. Lokalizacja słowa kluczowego „DETERMINISTIC” jest następująca.
źródło
W systemie Windows 10
Właśnie rozwiązałem ten problem, wykonując następujące czynności.
Przejdź do my.ini i dodaj te 2 wiersze pod [mysqld]
zrestartuj usługę MySQL
źródło
Got fatal error 1236 from master when reading data from binary log: 'Binary log is not open'
Spróbuj ustawić definicję funkcji!
Więc zamiast
CREATE FUNCTION get_pet_owner
napiszesz coś podobnego
CREATE DEFINER=
procadmin
@%
FUNCTION get_pet_ownerktó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.
źródło