2013-06-12 10 views
8

Pełna błąd:Ostrzeżenie: Niebezpieczne pisemne oświadczenie do dziennika binarnego przy użyciu formatu sprawozdania od BINLOG_FORMAT = OŚWIADCZENIE

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. 

Wydaje mi się tylko, aby uzyskać ten błąd podczas próby uruchomienia surowego SQL z Django. Jeśli uruchomię SQL z klienta MySQL CLI, nie otrzymam tego samego błędu. Oto 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; 

Celem jest to, aby zamówić dokumentację i zastosować kolejny numer do masy, aby utrzymywać tę kolejność w bazie danych.

Próbowałem uruchamiania tej komendy wewnątrz klienta, aby zobaczyć, czy mogę powtórzyć problem jednak nadal działa skutecznie:

mysql> SET GLOBAL binlog_format = 'STATEMENT'; 

Ponadto, ważne jest, że albo rozwiązać lub przepisać SQL do pracy z to ograniczenie, ponieważ ostateczna aplikacja prawie na pewno będzie działała w konfiguracji bazy danych master-slave.

* EDYCJA: Po przeczytaniu nieco więcej binlog_format, wydaje się, że ROW lub MIXED byłyby całkowicie dopuszczalne, jednak moim głównym problemem jest to, że nie mogę odtworzyć tego problemu w interfejsie MySQL CLI, aby sprawdzić, czy MIXED/ROW może rozwiązać ten problem?

Odpowiedz

8

Nie ma sposobu na przerobienie sql, aby nie wyrzucać tego komunikatu o błędzie. Jakikolwiek rozkaz będzie rzucał tę wiadomość, ponieważ niewolnik może mieć różne rzędy niż mistrz. mixed rozwiąże to, ponieważ przełączy się tylko na replikację opartą na row, gdy nie można bezpiecznie powielić instrukcji za pomocą statement.

+0

Tak, myślę, że po prostu przejście na "mieszane" jest odpowiedzią i rozwiązało problem w porządku dla mnie. Chciałbym móc replikować na CLI, ale teraz działa :) – DanH