2012-09-05 17 views
7

Używam log-error do zapisywania ostrzeżeń/błędów w pliku. Kiedy wykonuję polecenie INSERT IGNORE..SELECT, po prostu zapisz to ostrzeżenie.Ostrzegawcze ostrzeżenie mysql dotyczące ostrzeżenia

120905 3:01:23 [Warning] Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. INSERT IGNORE... SELECT is unsafe because the order in which rows are retrieved by the SELECT determines which (if any) rows are ignored. This order cannot be predicted and may differ on master and the slave. 

Chcę zatrzymać mysql logwriter zachować błąd powyżej wielokrotnie. (Nie widzę innego logu, ponieważ wypełniają cały plik dziennika ...)

Przede wszystkim wstawiam (a, b, c) do tabeli. c powinno być unikalne w tabeli, a a, b są używane do wyboru. Zapytanie będzie tak

SELECT c FROM table WHERE a=value1 AND value2<b AND b<value3 

I moje zapytanie wkładka jest

INSERT IGNORE INTO table VALUES (,,),(,,)...(,,) 

Myślałem, że mogę zmienić zapytanie nie produkują ostrzeżenie, ale moje dane zawierają unikalne pole i muszę zagwarantować, że złożone jest unikalny w tabeli. I 500 ~ 2000 wiersze powinny być wstawiane co kilka sekund, więc muszę zrobić luzem wstawić.

Jeśli wrzucono już kilkadziesiąt milionów wierszy, potrzebuję wstawić kolejne 2000 wierszy w kilka sekund. Jak mogę bezpiecznie umieścić je w tabeli bez wypełniania pliku dziennika ostrzeżeniami?

(nie mogę wyłączyć dziennik binarny bo trzeba użyć mysql replikacji).

+0

Powtarzasz tabele - ponieważ jeśli ten błąd jest znaczący. –

+0

Tak, używam replikacji mysql do tworzenia kopii zapasowych, powody skalowalności – user1640242

+0

Czy przeczytałeś wtedy komunikat o błędzie? – zerkms

Odpowiedz

13

Można użyć

SET GLOBAL LOG_WARNINGS = 0 

wyłączyć rejestrowanie i

SET GLOBAL LOG_WARNINGS = 1 

do włącz go ponownie. Moja osobista sugestia polega na tym, aby zamiast tego umieszczać niepoprawne zapytanie zamiast globalnie, aby można było śledzić, czy inne zapytania również powodują problem.

Pamiętaj, że starsze wersje MySQL nie obsługują tego.

+2

Jako zmienna globalna spowoduje to wyłączenie ostrzeżeń dla wszystkich sesji połączonych z bazą danych, prawda? – rjh

+0

Od wersji MySQL 5.6.4 ta zmienna jest zdefiniowana tylko jako GLOBALNA. – BoraMa

0

Myślę, że to pytanie jest nadal otwarte. Zastosowanie set max_error_count=0; your unsafe queries; set max_error_count=64;

przed zapytaniami chcesz uruchomić to zmienna sesji, więc nie trzeba być super łatwy w użyciu. Nie tylko ostrzeżenia nie będą wydawane, gdy zadzwonisz do ostrzeżenia o przekroczeniu 5 ostrzeżeń; ale takie ostrzeżenia nie zgłaszają się w plikach dziennika mysql. można go również używać w procedurach przechowywanych. Po zapytaniach, które wiesz, że są niebezpieczne, możesz przywrócić tę zmienną do pierwotnej wartości.