Istnieją dwa sposoby, aby rozwiązać ten problem:
wykonać następujące polecenia w konsoli MySQL:
SET GLOBAL log_bin_trust_function_creators = 1;
dodać następujące do mysql.ini pliku konfiguracyjnego:
log_bin_trust_function_creators = 1;
Ustawienie rozłącza sprawdzanie funkcji niedeterministycznych. Niedeterministyczne funkcje są funkcjami, które modyfikują dane (to znaczy mają instrukcję aktualizacji, wstawiania lub usuwania). Aby uzyskać więcej informacji, zobacz here.
Należy pamiętać, że jeśli rejestracja binarna NIE jest włączona, to ustawienie nie ma zastosowania.
Binary Logging of Stored Programs
If binary logging is not enabled, log_bin_trust_function_creators does not apply.
log_bin_trust_function_creators
This variable applies when binary logging is enabled.
Najlepszym rozwiązaniem jest lepsze zrozumienie i korzystanie z deterministycznych deklaracji dla funkcji składowanych. Deklaracje te są używane przez MySQL do optymalizacji replikacji i dobrze jest wybrać je ostrożnie, aby uzyskać zdrową replikację.
deterministyczne Rutynowa jest uważany za „deterministyczne” jeśli zawsze daje ten sam wynik dla tych samych parametrów wejściowych i nie deterministyczne inaczej. Jest to najczęściej używane do przetwarzania ciągów lub matematyki, ale nie jest do tego ograniczone.
NIE DETERMINISTYCZNY Przeciwny od "DETERMINISTYCZNEGO". "Jeśli w definicji rutynowej nie podano ani DETERMINISTYCZNEGO, ani NIE DETERMINISTYCZNEGO, wartością domyślną NIE jest DETERMINISTYCZNA Aby zadeklarować, że funkcja jest deterministyczna, musisz jawnie określić DETERMINISTYCZNY". Wygląda więc na to, że jeśli nie zostanie wydane żadne polecenie, MySQl potraktuje funkcję jako "NIE DETERMINISTYCZNĄ". To oświadczenie z instrukcji jest sprzeczne z innym stwierdzeniem z innej części podręcznika, które mówi: "Podczas tworzenia funkcji składowanej należy zadeklarować, że jest to deterministyczne lub że nie powoduje modyfikacji danych. być niebezpieczne dla odzyskiwania danych lub replikacji. domyślnie dla instrukcji CREATE FUNCTION zostać przyjęty, co najmniej jeden z deterministycznych, NO SQL, lub odczytuje dane SQL musi być określona jednoznacznie. w przeciwnym razie wystąpi błąd "
i osobiście dostałem błąd w MySQL 5.5 jeśli nie ma deklaracji, więc zawsze umieszczam co najmniej jedną deklarację "DETERMINISTYCZNA", "NIE DETERMINISTYCZNA", "ŻADNA SQL" lub "CZYTA DANE SQL", niezależnie od innych deklaracji, które mogę mieć.
CZYTA SQL DATA ten wyraźnie mówi do MySQL, że funkcja będzie tylko do odczytu danych z baz danych, a tym samym nie zawiera wskazówek, które modyfikują dane, ale zawiera instrukcje SQL, które odczytać dane (równ SELECT).
modyfikuje danych SQL Oznacza to, że procedura zawiera instrukcje, które mogą zapisywać dane (na przykład zawierać UPDATE, INSERT, DELETE lub ALTER instrukcje).
NIE SQL Wskazuje, że procedura nie zawiera instrukcji SQL.
ZAWIERA SQL Oznacza to, że procedura zawiera instrukcje SQL, ale nie zawiera stwierdzenia, które odczytu lub zapisu danych. Jest to ustawienie domyślne, jeśli żadna z tych cech nie jest wyraźnie podana. Przykładami takich instrukcji są SELECT NOW(), SELECT 10 + @ b, SET @x = 1 lub DO RELEASE_LOCK ("abc"), które wykonują, ale nie odczytują ani nie zapisują danych.
Należy zauważyć, że istnieją funkcje MySQL, które nie są deterministyczne bezpieczne, takie jak: NOW(), UUID(), itp., Które mogą powodować różne wyniki na różnych komputerach, więc funkcja użytkownika, która zawiera takie instrukcje, musi być zadeklarowane jako NIE DETERMINISTYCZNE. Ponadto funkcja odczytująca dane z niezaplanowanego schematu jest wyraźnie NIEDOPUSZCZALNA. *
Assessment of the nature of a routine is based on the “honesty” of the creator: MySQL does not check that a routine declared DETERMINISTIC is free of statements that produce nondeterministic results. However, misdeclaring a routine might affect results or affect performance. Declaring a nondeterministic routine as DETERMINISTIC might lead to unexpected results by causing the optimizer to make incorrect execution plan choices. Declaring a deterministic routine as NONDETERMINISTIC might diminish performance by causing available optimizations not to be used.
możesz wyjaśnić mi, co stało się w tle? – ASR
Podejrzeń, że baza danych ma funkcję, która modyfikuje dane (ma aktualizację, wstawianie lub usuwanie w nim). Aby uzyskać więcej informacji, zobacz tutaj: http://dev.mysql.com/doc/refman/5.0/en/stored-programs-logging.html – Donal
Czy muszę wykonać kopię zapasową przed wykonaniem polecenia? – ASR