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를 추가한다.
같은 데이터베이스의 다른 항목
- 3819ER_CHECK_CONSTRAINT_VIOLATED: Check constraint is violated (CHECK 제약 조건 위반)
- 1118ER_TOO_BIG_ROWSIZE: Row size too large
- 1170ER_BLOB_KEY_WITHOUT_LENGTH: BLOB/TEXT column used in key specification without a key length (키 길이 없이 BLOB/TEXT 컬럼을 키에 사용함)
- 3140ER_INVALID_JSON_TEXT: Invalid JSON text
- 1526ER_NO_PARTITION_FOR_GIVEN_VALUE: Table has no partition for value (해당 값에 대한 파티션 없음)
- 1049Unknown database 'name'
- 1364Field 'name' doesn't have a default value (필드에 기본값 없음)