sql >> Databasteknik >  >> RDS >> Mysql

Mysql-varningskod 1592 Osäker uttalande skrivet till den binära loggen med hjälp av uttalandeformat

Du är förmodligen bekant med två format för binär loggning , satsbaserad -- som loggar de faktiska frågorna som modifierar data på mastern så att de kan köras på slaven, och radbaserad -- som loggar före- och/eller efterbilder av den faktiska raddata som var ändras av frågan, så att slaven direkt kan tillämpa dessa ändringar på sina data... och blandat läge, där optimeraren och lagringsmotorn bestämmer vilket format som är det optimala formatet på en fråga-för-fråga-basis.

Uttrycket du kör är i princip osäkert eftersom du använder INSERT ... SELECT i en tabell med en kolumn för automatisk ökning. Om en fråga av den allmänna formen användes i ett STATEMENT -baserad miljö och SELECT inte returnerade raderna i samma ordning på master och slav kunde raderna väljas i en annan ordning, och därmed sluta med olika auto-inkrementvärden.

I praktiken är den specifika fråga du kör är deterministisk eftersom du bara infogar en rad och du explicit anger värdet för automatisk ökning. Jag misstänker att det är orsaken till din förvirring. Det verkar dock som att du fortfarande utlöser varningen eftersom du gör INSERT ... SELECT in i en tabell med en automatisk ökning, och servern verkar tillämpa den generaliserade "osäkra" beslutsamheten på frågan som en principfråga snarare än precision.

Byt binlog_format till MIXED bör göra att varningen försvinner, eftersom servern kan byta läge efter eget gottfinnande... och det är mycket osannolikt att det har negativa biverkningar. Om det inte vore för det faktum att STATEMENT har alltid varit standard (eftersom det till en början var den enda tillgängliga typen av replikering), misstänker jag att de skulle ha gjort MIXED standarden för länge sedan... faktiskt, om du bekantar dig med det interna i binära loggar, skulle du förmodligen vara benägen att göra som jag och använda ROW på nästan allt... det tenderar att skapa en mycket mer användbar binär logg för att felsöka och rädda dig själv ur problem, eftersom den "gamla" raddatan är inloggad DELETE och UPDATE .




  1. Hur ansluter jag till SQL Server via sqlalchemy med Windows-autentisering?

  2. Ställ in NOW() som standardvärde för datetime datatype?

  3. Välja distinkt 2 kolumnkombination i mysql

  4. Hur lagrar MySQL data