10

完全なエラー:

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.

Django から生の SQL を実行しようとしたときにのみ、このエラーが発生するようです。MySQL CLI クライアントから SQL を実行しても、同じエラーは発生しません。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;

これの目的は、レコードを並べ替え、重みに連番を適用して、データベース内でこの順序を維持することです。

クライアント内でこのコマンドを実行して、問題を再現できるかどうかを確認しましたが、それでも正常に実行されます。

mysql> SET GLOBAL binlog_format = 'STATEMENT';

また、最終的なアプリケーションはほぼ確実にマスター/スレーブ データベース セットアップで実行されるため、この制約に対応するように SQL を解決するか書き直すことが重要です。

*EDIT:もう少し読んだ後binlog_format、ROWまたはMIXEDが完全に受け入れられるように見えますが、私の主な懸念は、MIXED / ROWが実際にこの問題を解決できるかどうかをテストするために、MySQL CLIでこの問題を再現できないことです?

4

1 に答える 1

11

そのエラー メッセージをスローしないように SQL を書き直す方法はありません。スレーブはマスターとは異なる行を持つ可能性があるため、どのような順序でもそのメッセージがスローされます。ステートメントが で複製するのが安全でない場合にのみ、ベースの複製にmixed切り替えるため、それを解決します。rowstatement

于 2013-06-12T04:38:37.793 に答える