17.4.1.31 복제 및 트랜잭션
같은 트랜잭션에 트랜잭션 및 비 트랜잭션 문을 혼합 일반적으로 복제 환경에서 트랜잭션 및 비 트랜잭션 테이블을 모두 업데이트하는 트랜잭션은 피해야한다. 트랜잭션 (또는 임시) 및 비 트랜잭션 테이블 모두에 액세스하고 그들에게 쓸 문을 사용하는 것도 피해야한다.
MySQL 5.5.2 이후에서는, 서버는 바이너리 로그에 다음 규칙을 사용합니다.
트랜잭션의 첫 번째 문이 비 트랜잭션 인 경우, 그들은 즉시 바이너리 로그에 기록됩니다. 트랜잭션의 나머지 문은 캐시 된 트랜잭션이 커밋 될 때까지 바이너리 로그에 기록되지 않습니다. (트랜잭션이 롤백 된 경우 캐시 된 문은 롤백 할 수없는 비 트랜잭션 변경을 할 경우에만 바이너리 로그에 기록됩니다. 그렇지 않으면 그들은 파괴됩니다.)
명령문 기반 로깅의 경우 비 트랜잭션 문 로깅은
binlog_direct_non_transactional_updates
시스템 변수에 의해 영향을받습니다. 이 변수가OFF
의 경우 (디폴트), 로깅은 위와 같이됩니다. 이 변수가ON
의 경우 비 트랜잭션 문이 트랜잭션의 어디에서 발생하더라도 (첫 번째 비 트랜잭션 문뿐만 아닙니다) 즉시 로깅이 발생합니다. 다른 문은 트랜잭션 캐시에 보관 된 트랜잭션이 커밋 할 때 로그가 기록됩니다.binlog_direct_non_transactional_updates
행 형식 또는 혼합 형식 바이너리 로깅에 영향을주지 않습니다.
트랜잭션 비 트랜잭션 및 혼합 문 이러한 규칙을 적용하는 경우, 서버는 비 트랜잭션 테이블 만 변경하는 경우에는 문을 비 트랜잭션으로 간주하고 트랜잭션 테이블 만 변경하는 경우에는 거래로 간주합니다. MySQL 5.6에서는 비 트랜잭션 및 트랜잭션 테이블을 모두 참조하여 사용되는 모든 테이블을 업데이트하는 문은 "혼합"문 간주됩니다. (이전의 MySQL 릴리즈 시리즈는 비 트랜잭션 및 트랜잭션 테이블 모두를 변경하는 문이 혼합 간주되어있었습니다.) 혼합 문은 트랜잭션 문과 마찬가지로 캐시 된 트랜잭션이 커밋 할 때 로그 이 기록됩니다.
트랜잭션 테이블을 업데이트하는 혼합 문은 다음 조치 중 하나를 수행하는 경우도 안전하지 않다고 간주됩니다.
트랜잭션 테이블을 업데이트하거나 읽을
비 트랜잭션 테이블을 읽기 트랜잭션 격리 수준이 REPEATABLE_READ 미만
트랜잭션에서 트랜잭션 테이블 업데이트에 계속 혼합 문은 다음 작업 중 하나를 수행 할 때 안전하지 않은 것으로 간주됩니다.
테이블을 업데이트하고 임시 테이블에서 읽을
비 트랜잭션 테이블을 업데이트하고 binlog_direct_non_trans_update가 OFF
자세한 내용은 섹션 17.1.2.3 "바이너리 로그에서의 안전 및 안전하지 않은 문의 판단" 을 참조하십시오.
혼합 문은 혼합 바이너리 로깅 형식과는 관계가 없습니다.
트랜잭션에서 트랜잭션 및 비 트랜잭션 테이블에 업데이트가 혼재하고있는 상황에서 바이너리 로그의 문 순서는 제대로 필요한 모든 문이 바이너리 로그에 기록됩니다 ( ROLLBACK
의 경우에도). 그러나 첫 번째 연결 트랜잭션이 완료되기 전에 두 번째 연결이 비 트랜잭션 테이블을 업데이트 할 때 문이 기록되는 순서가 흐트러지는 경우가 있습니다. 첫 번째 연결에 의해 실행되는 트랜잭션의 상태에 관계없이 두 번째 연결 업데이트가 실행 된 직후에 기록되기 때문입니다.
마스터와 슬레이브로 다른 스토리지 엔진을 사용하는 슬레이브에 비 트랜잭션 테이블을 사용하여 마스터에서 트랜잭션 테이블을 복제 할 수 있습니다. 예를 들어, InnoDB
마스터 테이블을 MyISAM
슬레이브 테이블로 복제 할 수 있습니다. 그러나 이렇게 할 경우, 슬레이브가 BEGIN
블록의 처음에서 다시 시작했기 때문에 BEGIN
... COMMIT
블록의 중간에 슬레이브가 정지 한 경우 문제가 발생합니다.
MySQL 5.6에서는 마스터의 MyISAM
테이블에서 슬레이브에서 트랜잭션 테이블 ( InnoDB
스토리지 엔진을 사용하는 테이블 등)에 트랜잭션을 복제 할 안전합니다. 이 같은 경우 (MySQL 5.5.0 이후) 마스터에서 발행 된 AUTOCOMMIT=1
문이 복제되고 슬레이브에서 AUTOCOMMIT
모드가 적용됩니다.
슬레이브의 스토리지 엔진 타입이 아닌 트랜잭션의 경우, 트랜잭션 및 비 트랜잭션 테이블에 업데이트가 혼재하는 마스터 트랜잭션은 마스터 트랜잭션 테이블과 슬레이브 비 트랜잭션 테이블 간의 데이터 불일치가 발생할 가능성이있다 때문에 피해야한다. 즉, 이러한 트랜잭션 복제 동기화를 잃고, 마스터 스토리지 엔진 자체의 동작이 될 가능성이 있습니다. 현재 MySQL은 이에 대해 경고를 발행하지 않기 때문에 트랜잭션 테이블을 마스터에서 슬레이브에 비 트랜잭션 테이블에 복제 할 때는 충분히주의하도록합니다.
트랜잭션 내에서 바이너리 로깅 형식을 변경하는 MySQL 5.5.3 이후에서는 트랜잭션이 진행 중일 때는 binlog_format
시스템 변수는 읽기 전용입니다. (Bug # 47863)
각 트랜잭션 ( autocommit
트랜잭션을 포함)은 BEGIN
문으로 시작하고 COMMIT
또는 ROLLBACK
문으로 끝나는 것처럼 바이너리 로그에 기록됩니다. MySQL 5.6에서는이 진실이 아닌 트랜잭션 스토리지 엔진 ( MyISAM
등)를 사용하는 테이블에 영향을 미치는 문에도 적용됩니다.