2014-09-24 2 views
43

Podczas importowania bazy danych w mysql, mam następujący błąd:deterministyczne NO SQL lub odczytuje dane SQL w deklaracji i rejestrowania binarny jest włączony

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 który Czego potrzebuje zmiany. Czy ktoś może mi pomóc, jak rozwiązać ten problem?

Odpowiedz

83

Istnieją dwa sposoby, aby rozwiązać ten problem:

  1. wykonać następujące polecenia w konsoli MySQL:

    SET GLOBAL log_bin_trust_function_creators = 1;

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

+0

możesz wyjaśnić mi, co stało się w tle? – ASR

+1

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

+0

Czy muszę wykonać kopię zapasową przed wykonaniem polecenia? – ASR

15
  • Podczas tworzenia funkcję składowaną, należy zadeklarować, że albo jest to deterministyczne lub że nie modyfikuje danych. W przeciwnym razie może to być niebezpieczne dla odzyskiwania lub replikacji danych.

  • Domyślnie dla instrukcji CREATE FUNCTION, aby zostać przyjęty, co najmniej jeden z deterministyczny, NO SQL lub SQL odczytuje dane muszą być określone wyraźnie. W przeciwnym razie wystąpi błąd:

Aby rozwiązać ten problem, dodaj następujące linie po powrocie i przed rozpoczęciem oświadczenie:

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 szczegółów na temat tego problemu proszę Przeczytaj Here

+0

Działa to, ponieważ ustawienie "READS SQL DATA" jest najmniej restrykcyjne z tych trzech. Jeśli twoja funkcja należy do kategorii "NO SQL" lub "DETERMINISTIC", możesz poprawić wydajność, modyfikując funkcje. Z drugiej strony ustawienie "READS SQL DATA" jest również najmniej podatne na błędy. Więc jeśli nieprawidłowo użyjesz 'NO SQL' lub' DETERMINISTIC', możesz uzyskać nieprawidłowe wyniki. – Jonathan

1

po Komentarzu Donalda:

This variable applies when binary logging is enabled.

Wszystko co musiałem zrobić, to:

  1. niepełnosprawnych log_bin w moim.CNF (#log_bin)
  2. restartu mysql
  3. importu DB
  4. umożliwić log_bin
  5. restartu mysql

że wyjść tego problemu importu.

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

Powiązane problemy