DBAtlas · 데이터베이스 운영 아틀라스

1592: ER_BINLOG_UNSAFE_STATEMENT: Unsafe statement written to the binary log (binary log에 안전하지 않은 문장 기록)

MySQL

의미

STATEMENT 기반 binlog 형식을 사용하는 중에 결과가 비결정적인(replica에서 다른 결과를 낼 수 있는) 문장이 실행되었다. source와 replica 간 데이터 불일치 위험이 있으므로 MySQL은 binlog에 기록할 때 경고를 발생시킨다.

원인

binlog_format=STATEMENT에서: UUID(), SYSDATE(), USER() 같은 비결정적 함수(NOW()는 STATEMENT에서도 안전하게 복제된다), ORDER BY 없이 LIMIT이 있는 UPDATE/DELETE, AUTO_INCREMENT가 섞인 INSERT, 특정 사용자 정의/시스템 함수가 원인이다. 이 문장들은 모든 서버에서 같은 결과를 내지 않을 수 있다.

해결 방법

binlog 형식을 행 기반으로 전환한다(권장. ROW는 MySQL 5.7.7부터 기본값이다): my.cnf에 binlog_format=ROW 또는 SET PERSIST binlog_format = ROW; (binlog_format 변수는 8.0.34부터 deprecated이며 변경은 새 세션부터 적용된다). ROW 형식은 비결정적 문장을 안전하게 복제한다. STATEMENT를 유지해야 한다면 비결정적 함수/표현식을 상수 값으로 바꾸고 LIMIT이 있는 DML에 결정적인 ORDER BY를 추가한다.

DBAtlas에서 열기 →

같은 데이터베이스의 다른 항목