17.1.2.3 바이너리 Logging의 안전 및 안전하지 않은 명령문의 판단
MySQL 복제의 문 '안전'는 명령문 기반 형식을 사용하여 문과 그 결과를 정확하게 복제 할 수 있는지 여부입니다. 이것이 문에 해당하는 경우 문은 안전이라고, 그렇지 않은 경우는 안전하지 않다고 말합니다.
일반적으로 문이 결정적이면 안전하며, 그렇지 않은 경우는 안전하지 않습니다. 그러나 특정 비 결정적 함수는 "안전하지 않은"것으로 간주하지 않습니다 (이 섹션 뒷부분의 안전하지 않은 것으로 간주되지 않는 비 결정적 함수 를 참조하십시오). 또한 부동 소수점 수학 함수 (하드웨어 의존)에서의 결과를 사용하는 문은 항상 안전하지 않은 것으로 간주됩니다 ( 섹션 17.4.1.12 "복제 및 부동 소수점 값" 을 참조하십시오).
안전 및 안전하지 않은 문 처리 문은 문이 안전한 것으로 간주되는지 여부에 따라, 그리고 바이너리 로깅 형식 (즉, binlog_format
의 현재 값)에 따라 다르게 처리됩니다.
행 기반 로깅을 사용하는 경우, 안전 및 안전하지 않은 문의 취급에 차이가 없습니다.
혼합 형식 로깅을 사용하는 경우 안전 않으면 플래그 된 문은 행 기반 형식을 사용하여 로그가 기록되고 안전한 것으로 간주 된 문은 명령문 기반 형식을 사용하여 로그가 기록됩니다.
명령문 기반 로깅을 사용하는 경우 안전 않으면 플래그 된 문은이 결과에 경고를 생성합니다. 안전한 문은 정상적으로 로그가 기록됩니다.
안전 않으면 플래그 된 각 문은 경고를 생성합니다. 이전에는 이러한 문이 대량으로 마스터에서 실행 된 경우 오류 로그 파일이 매우 커질 수있었습니다. 이를 방지하기 위해 MySQL은 다음과 같이 작동 경고 억제 메커니즘 (MySQL 5.6.7에서 추가)를 제공합니다. 최근 50 ER_BINLOG_UNSAFE_STATEMENT
경고가 50 초 간격으로 50 회 초 생성 된 경우 경고 억제가 활성화됩니다. 활성화되어있는 때에는이를 통해이 같은 경고가 오류 로그에 기록되는 것은 아닙니다. 대신이 유형의 경고가 50 개 생성 될 때마다 (마지막 경고가 N 번 최근 S 초간 반복되어)
오류 로그에 기록됩니다. 50 개의 최근의이 같은 경고가 50 초 이내에 발행되는 한, 이것이 계속합니다. 주파수가이 임계 값 아래로 떨어지면 다시 정상적으로 경고가 기록됩니다. 경고 억제는 명령문 기반 로깅 문 안전이 어떻게 결정되는지 및 경고가 클라이언트에 어떻게 보낼지에 영향을주지 않습니다. MySQL 클라이언트는 계속 이러한 문마다 하나의 경고를받습니다.
자세한 내용은 섹션 17.1.2 "복제 형식" 을 참조하십시오.
안전하지 않은 것으로 간주되는 문 다음 특징을 가진 문은 안전하지 않은 것으로 간주됩니다.
슬레이브로 다른 값을 반환 할 수있는 시스템 함수를 포함하는 문. 이 함수는
FOUND_ROWS()
,GET_LOCK()
,IS_FREE_LOCK()
,IS_USED_LOCK()
,LOAD_FILE()
,MASTER_POS_WAIT()
,PASSWORD()
,RAND()
,RELEASE_LOCK()
,ROW_COUNT()
,SESSION_USER()
,SLEEP()
,SYSDATE()
,SYSTEM_USER()
,USER()
,UUID()
,UUID_SHORT()
이 포함되어 있습니다.안전하지 않은 것으로 간주되지 않는 비 결정적 함수. 이 함수는 결정적인하지 않지만, 로깅 및 복제 목적의 경우 안전으로 처리됩니다 :
CONNECTION_ID()
,CURDATE()
,CURRENT_DATE()
,CURRENT_TIME()
,CURRENT_TIMESTAMP()
,CURTIME()
,LAST_INSERT_ID()
,LOCALTIME()
)LOCALTIMESTAMP()
)NOW()
,UNIX_TIMESTAMP()
)UTC_DATE()
)UTC_TIME()
및UTC_TIMESTAMP()
.자세한 내용은 섹션 17.4.1.15 "복제와 시스템 함수" 를 참조하십시오.
시스템 변수에 대한 참조 대부분의 시스템 변수는 명령문 기반 형식으로 제대로 복제되지 않습니다. 섹션 17.4.1.34 "복제 및 변수" 를 참조하십시오. 예외는 섹션 5.2.4.3 "혼합 형식의 바이너리 로깅 형식" 을 참조하십시오.
UDF UDF가 무엇을하는지는 제어 할 수 없기 때문에 그것이 안전하지 않은 문을 실행하고 있다고 추정해야합니다.
트리거 또는 저장 프로그램은 AUTO_INCREMENT 컬럼을 가진 테이블을 업데이트한다. 행이 업데이트되는 순서가 마스터와 슬레이브로 다를 수 있기 때문에 이것은 안전하지 않습니다.
또한 복합 기본 키를 가진 테이블이 복합 키의 선두 컬럼이 아닌
AUTO_INCREMENT
컬럼이 포함되는 테이블에INSERT
하는 것은 안전하지 않습니다.자세한 내용은 섹션 17.4.1.1 "복제 및 AUTO_INCREMENT" 를 참조하십시오.
INSERT DELAYED 문이 문이 행 삽입이 병렬로 실행되는 문이 폐쇄 될 가능성이 있기 때문에 안전하지 않은 것으로 간주됩니다.
여러 기본 키 또는 고유 키가있는 테이블에서 INSERT ... ON DUPLICATE KEY UPDATE 문 여러 기본 키 또는 고유 키가있는 테이블에 대해 실행될 때이 문은 안전하지 않은 것으로 간주됩니다 ( 스토리지 엔진이 키를 체크하는 순서에 취약하지만, 이것은 결정적 아니라 또한 MySQL Server가 업데이트되는 행의 선택이 이것에 의존하기 때문입니다).
여러 고유 키 또는 기본 키가 테이블에 대한
INSERT ... ON DUPLICATE KEY UPDATE
문은 MySQL 5.6.6 이후의 문 기반 복제는 안전하지 않은 것으로 표시됩니다. (Bug # 11765650, Bug # 58637)LIMIT를 사용하는 업데이트 행의 검색 순서가 지정되어 있지 않기 때문에 안전하지 않은 것으로 간주됩니다. 섹션 17.4.1.16 "복제 및 LIMIT" 를 참조하십시오.
로그 테이블에 액세스하거나 참조 시스템 로그 테이블의 내용은 마스터와 슬레이브로 다를 수 있습니다.
트랜잭션 작업 후 비 트랜잭션 작업 트랜잭션에서 트랜잭션 읽기 또는 쓰기 후 비 트랜잭션 읽기 또는 쓰기를 실행하는 것을 허용하는 것은 안전하지 않은 것으로 간주됩니다.
자세한 내용은 섹션 17.4.1.31 "복제 및 트랜잭션" 을 참조하십시오.
셀프 로깅 테이블에 액세스하거나 참조 셀프 로깅 테이블에 대한 모든 읽기 및 쓰기는 안전하지 않은 것으로 간주됩니다. 트랜잭션 내에서 자동 로깅 테이블에 대한 읽기 또는 쓰기에 오는 명령문도 안전하지 않은 것으로 간주됩니다.
LOAD DATA INFILE 문 MySQL 5.6 이상에서
LOAD DATA INFILE
는 안전하지 않은 것으로 간주 문 기반 모드에서 경고가 생성 된 혼합 형식 로깅 사용시 행 기반 형식으로 전환 원인이됩니다. 섹션 17.4.1.17 "복제 및 LOAD DATA INFILE" 를 참조하십시오.
자세한 내용은 섹션 17.4.1 "복제 기능 및 문제" 를 참조하십시오.