본문 바로가기
MySql

MySQL 경고 : BINLOG_FORMAT = STATEMENT이므로 문 형식을 사용하여 바이너리 로그에 기록 된 안전하지 않은 문

by 베이스 공부 2020. 12. 30.
반응형

전체 오류 :

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을 해결하거나 다시 작성하는 것이 중요합니다.

* 편집 : 좀 더 binlog_format 을 읽은 후 ROW 또는 MIXED가 완벽하게 허용되는 것처럼 보이지만 내 주요 관심사는 MySQL CLI에서이 문제를 복제하여 여부를 테스트 할 수 없다는 것입니다. MIXED / ROW가이 문제를 실제로 해결할 수 있습니까?

 

해결 방법

 

해당 오류 메시지를 표시하지 않도록 SQL을 다시 작성할 수있는 방법은 없습니다. 슬레이브가 마스터와 다른 행을 가질 수 있으므로 모든 종류의 순서가 해당 메시지를 던집니다. mixed 는 문이 statement 로 복제하기에 안전하지 않은 경우에만 row 기반 복제로 전환되므로 문제를 해결합니다.

 

참조 페이지 https://stackoverflow.com/questions/17057593

 

 

반응형

댓글