2013-06-12 4 views
8

errore completa:Attenzione: dichiarazione Unsafe scritto nel registro binario usando il formato economico in quanto BINLOG_FORMAT = istruzione

Warning: Unsafe statement written to the binary log using statement format 
since BINLOG_FORMAT = STATEMENT. Statements writing to a table with an 
auto-increment column after selecting from another table are unsafe because 
the order in which rows are retrieved determines what (if any) rows will be 
written. This order cannot be predicted and may differ on master and the 
slave. 

mi sembra solo per ottenere questo errore quando si tenta di eseguire SQL prima da Django. Se eseguo l'SQL dal client CLI MySQL, non ottengo lo stesso errore. Ecco lo SQL:

UPDATE picture p 
JOIN (
    SELECT @inc := @inc + 1 AS new_weight, id 
    FROM (SELECT @inc := 0) temp, (
     SELECT id FROM picture 
     WHERE album_id = 5 
     ORDER BY taken_date ASC 
    ) AS pw 
) AS pw 
ON p.id = pw.id 
SET p.weight = pw.new_weight; 

Lo scopo di questo è quello di ordinare i record, e applicare un numero sequenziale al peso, al fine di persistere questo ordinamento nel database.

Ho provato a fare funzionare questo comando all'interno del client per vedere se riesco a replicare il problema tuttavia si corre ancora con successo:

mysql> SET GLOBAL binlog_format = 'STATEMENT'; 

Inoltre, è importante che io sia risolvere o riscrivere il codice SQL per lavorare con questo vincolo in quanto l'applicazione finale quasi certamente verrà eseguita attraverso l'installazione di un database master-slave.

* EDIT: Dopo aver letto un po 'più binlog_format, sembra come se ROW o misto sarebbe perfettamente accettabile, ma la mia preoccupazione principale non è in grado di replicare questo problema nel MySQL CLI, al fine di verificare se MIXED/ROW può infatti risolvere questo problema?

risposta

8

Non esiste alcun modo per riscrivere lo sql per non generare quel messaggio di errore. Qualsiasi tipo di ordine genererà quel messaggio in quanto lo slave potrebbe avere file diverse dal master. mixed lo risolverà, in quanto passerà alla replica basata su row quando un'istruzione non è sicura da replicare con statement.

+0

Sì, penso che il semplice passaggio a 'mixed' è la risposta e ha risolto il problema per me. Vorrei poterlo replicare sulla CLI ma ora funziona :) – DanH

Problemi correlati