Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL-Warncode 1592 Unsichere Anweisung, die mithilfe des Anweisungsformats in das Binärprotokoll geschrieben wurde

Sie sind vermutlich mit den zwei Formaten der binären Protokollierung , anweisungsbasiert – was die eigentlichen Abfragen protokolliert, die Daten auf dem Master modifizieren, damit sie auf dem Slave ausgeführt werden können, und zeilenbasiert – was Vorher- und/oder Nachbilder der tatsächlichen Zeilendaten protokolliert durch die Abfrage geändert, sodass der Slave diese Änderungen direkt auf seine Daten anwenden kann ... und gemischter Modus, bei dem der Optimierer und die Speicher-Engine auf einer Abfrage-für-Abfrage-Basis bestimmen, welches Format das optimale Format ist.

Die von Ihnen ausgeführte Anweisung ist grundsätzlich unsicher weil Sie INSERT ... SELECT verwenden in eine Tabelle mit einer Auto-Increment-Spalte. Wenn eine Abfrage dieser allgemeinen Form in einem STATEMENT verwendet wurden -basierte Umgebung und die SELECT die Zeilen nicht in der gleichen Reihenfolge auf Master und Slave zurückgeben, könnten die Zeilen in einer anderen Reihenfolge ausgewählt werden und somit zu unterschiedlichen Auto-Inkrement-Werten führen.

In der Praxis das spezifische Abfrage, die Sie ausführen ist deterministisch, da Sie nur eine Zeile einfügen und den Auto-Increment-Wert explizit angeben. Ich vermute, das ist der Grund für deine Verwirrung. Es scheint jedoch, dass Sie die Warnung immer noch auslösen, weil Sie INSERT ... SELECT ausführen in eine Tabelle mit automatischem Inkrement, und der Server scheint die verallgemeinerte "unsichere" Bestimmung eher aus Prinzip als aus Genauigkeit auf die Abfrage anzuwenden.

Ändern Sie Ihr binlog_format zu MIXED sollte die Warnung verschwinden lassen, da der Server den Modus nach eigenem Ermessen wechseln kann ... und es sehr unwahrscheinlich ist, dass negative Nebenwirkungen auftreten. Wenn da nicht STATEMENT wäre immer die Standardeinstellung war (da dies anfangs die einzige verfügbare Art der Replikation war), vermute ich, dass sie MIXED gemacht hätten die Voreinstellung ist schon lange her ... tatsächlich, wenn Sie sich mit den Interna von Binärlogs vertraut machen, würden Sie wahrscheinlich geneigt sein, es mir gleich zu tun und ROW zu verwenden auf so gut wie alles ... es neigt dazu, ein viel nützlicheres Binärlog für die Fehlersuche und die Rettung aus Schwierigkeiten zu machen, weil die "alten" Zeilendaten auf DELETE protokolliert werden und UPDATE .