2012-09-05 5 views
7

Ich benutze Protokollfehler, um Warnung/Fehler in eine Datei zu schreiben. Wenn ich die INSERT IGNORE..SELECT-Anweisung ausführe, schreibe einfach diese Warnmeldungen.Abschaltung mysql unsafe Anweisung Warnung

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. 

Ich möchte mysql Logwriter stoppen Schreiben Sie den Fehler immer wieder und wieder. (Ich kann kein anderes Protokoll sehen, weil sie die gesamte Logdatei ausfüllt ...)

Zuerst füge ich (a, b, c) in eine Tabelle ein. c sollte in der Tabelle eindeutig sein, und a, b werden verwendet, um auszuwählen. Abfrage wird wie diese

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

und meine INSERT-Abfrage ist

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

Ich dachte, ich die Abfrage nicht Warnung zu erzeugen, ändern könnte, aber meine Daten enthalten eindeutiges Feld, und ich brauche, dass die eingereichten garantieren ist einzigartig in der Tabelle. Und 500 ~ 2000 Zeilen sollten alle paar Sekunden eingefügt werden, also muss ich Massen einfügen.

Wenn bereits Dutzende von Millionen Zeilen eingefügt sind, und ich weitere 2000 Zeilen in wenigen Sekunden einfügen muss. Wie kann ich sie sicher in die Tabelle einfügen, ohne die Logdatei mit den Warnungen zu füllen?

(Ich kann nicht das Binärlog ausschalten, weil ich die MySQL-Replikation verwenden müssen.)

+0

Replizieren Sie die Tabellen - denn wenn Sie diesen Fehler haben, ist signifikant. –

+0

Ja, ich verwende mysql Replikation für Backup, Skalierbarkeit Gründe – user1640242

+0

Also hast du die Fehlermeldung dann gelesen? – zerkms

Antwort

13

Sie

SET GLOBAL LOG_WARNINGS = 0 

Protokollierung zu deaktivieren und zu

SET GLOBAL LOG_WARNINGS = 1 

verwenden können schalte es wieder an. Mein persönlicher Vorschlag ist, die problematische Abfrage mit diesen zu umhüllen, anstatt sie global festzulegen, so dass Sie verfolgen können, ob andere Abfragen das Problem ebenfalls verursachen.

Beachten Sie, dass ältere Versionen von MySQL dies nicht unterstützen.

+2

Als globale Variable werden dadurch Warnungen für alle mit der Datenbank verbundenen Sitzungen deaktiviert, oder? – rjh

+0

Seit MySQL 5.6.4 ist diese Variable nur noch als GLOBAL definiert. – BoraMa

0

Ich denke, diese Frage ist noch offen. Verwenden set max_error_count=0; your unsafe queries; set max_error_count=64;

vor den Fragen, die Sie ausführen möchten es eine Session-Variable ist, so dass Sie Superuser nicht benutzen müssen. Nicht nur Warnungen werden ausgegeben, wenn Sie das Warnlimit 5 anzeigen; Solche Warnungen werden jedoch nicht in mysql-Protokolldateien gemeldet. Sie können es auch in gespeicherten Prozeduren verwenden. Nachdem Sie wissen, dass Ihre Abfragen unsicher sind, können Sie diese Variable auf ihren ursprünglichen Wert zurücksetzen.