5.2.4.2 바이너리 로그 형식 설정
MySQL Server를 --binlog-format=
에서 시작하여 바이너리 로깅 형식을 명시 적으로 선택할 수 있습니다. type
type
은 다음 값이 지원됩니다.
STATEMENT
의 경우 로깅은 문에 근거합니다.ROW
의 경우 로깅은 행 기준으로합니다.MIXED
의 경우 로깅은 혼합 형식을 사용합니다.
MySQL 5.6에서는 기본 바이너리 로깅 형식은 STATEMENT
입니다.
기록 형식은 실행시 변경할 수 있습니다. 모든 클라이언트에 대해 글로벌 형식을 지정하려면 binlog_format
시스템 전역 변수의 값을 설정합니다.
mysql>SET GLOBAL binlog_format = 'STATEMENT';
mysql>SET GLOBAL binlog_format = 'ROW';
mysql>SET GLOBAL binlog_format = 'MIXED';
개별 클라이언트는 binlog_format
의 세션 값을 설정함으로써 클라이언트 자신의 명령문 로깅 포맷을 제어 할 수 있습니다.
mysql>SET SESSION binlog_format = 'STATEMENT';
mysql>SET SESSION binlog_format = 'ROW';
mysql>SET SESSION binlog_format = 'MIXED';
각각의 MySQL Server는 서버 자체의 바이너리 로깅 형식 만 설정할 수 있습니다 ( binlog_format
가 전역 또는 세션 범위 중 설정되는 경우에도 적용됩니다). 이것은 복제 마스터의 로깅 형식을 변경해도 슬레이브가 그 로깅 형식을 일치하도록 변경하는 것은 아니다 것을 의미합니다. ( STATEMENT
모드를 사용중인 경우 binlog_format
시스템 변수는 복제되지 않고 MIXED
또는 ROW
로깅 모드를 사용중인 경우 복제되지만 슬레이브에 의해 무시됩니다.) 복제가 진행되는 동안 마스터의 바이너리 로깅 형식을
변경하거나 슬레이브에서 그것을 변경하지 않거나하면 예기치 않은 결과를 초래하거나 복제의 실패를 초래할 수 있습니다.
글로벌 값 또는 세션 값 binlog_format
을 변경하려면 SUPER
권한이 필요합니다.
로깅 형식의 수동 전환 외에 슬레이브 서버가 자동으로 형식을 변경하는 경우도 있습니다. 이것은 서버가 STATEMENT
또는 MIXED
중 하나의 형식으로 실행하고, ROW
로깅 형식으로 기록 된 이벤트를 바이너리 로그에서 발견 한 경우에 발생합니다. 이 경우, 슬레이브는 그 이벤트에 대해 행 기반 복제에 임시로 전환, 그 후에 이전의 원래 형태로 전환됩니다.
클라이언트가 세션마다 바이너리 로깅을 설정하는 데는 몇 가지 이유가 있습니다.
많은 작은 변화를 데이터베이스에 수행 세션에서는 행 기반 로깅을 사용하는 것이 좋은 경우가 있습니다.
WHERE
절에서 많은 행과 일치하는 업데이트를 실행하는 세션에서는 많은 행보다 2,3 개의 문을 기록하는 것이 더 효율적이기 때문에 명령문 기반 로깅을 사용하는 것이 좋다 경우가 있습니다.일부 문은 마스터에서 많은 실행 시간을 필요로하지만, 변경되는 행이 몇 줄 것입니다. 따라서 행 기반 로깅을 사용하여 해당 행을 복제하는 것이 도움이 될 수 있습니다.
복제 형식을 실행할 때 전환 할 수없는 예외도 있습니다.
스토어드 함수 또는 트리거에서 실행하는 경우
NDB
스토리지 엔진을 사용하는 경우세션이 현재 행 기반 복제 모드에서 임시 테이블이 열려있는 경우
이 중 하나의 경우 형식을 전환하려고하면 결과는 오류입니다.
InnoDB
테이블을 사용하고 있고, 트랜잭션 격리 수준이 READ COMMITTED
또는 READ UNCOMMITTED
의 경우 행 기반 로깅 만 사용할 수 있습니다. 로깅 형식을 STATEMENT
로 변경하는 것은 가능하지만, InnoDB
는 삽입을 수행 할 수 없기 때문에 실행시 이렇게하면 매우 빠르고 오류가 발생합니다.
임시 테이블이 존재하는 경우 복제 형식을 실행할 때 전환은 권장되지 않습니다. 이것은 임시 테이블 명령문 기반 복제를 사용중인 경우에만 기록되어 행 기반 복제에서는 이러한 로그에 기록되지 않기 때문입니다. 혼합 형식의 복제는 임시 테이블은 일반적으로 기록됩니다. 사용자 정의 함수 (UDF) 및 UUID()
함수에서 예외가 발생합니다.
바이너리 로그 형식을 ROW
로 설정하면 많은 변화 행 기반 형식을 사용하여 바이너리 로그에 기록됩니다. 그러나 일부 변경 명령문 기반 형식이 사용됩니다. 예를 들어, CREATE TABLE
, ALTER TABLE
, DROP TABLE
등의 모든 DDL (데이터 정의 언어) 문이 이에 해당합니다.
--binlog-row-event-max-size
옵션은 행 기반 복제가 가능한 서버에서 사용할 수 있습니다. 행이 옵션의 값을 넘지 않는 바이트 단위의 크기를 가지는 덩어리로 바이너리 로그에 저장됩니다. 이 값은 256의 배수 여야합니다. 기본값은 1024입니다.
복제를 위해 문 기반 로깅을 사용하는 경우 문의 설계 방법이 데이터 변경이 비 결정적이다 (즉 쿼리 최적화의 뜻에 맡길 수있게되어있다) 때 마스터와 슬레이브의 데이터 이 다를 수 있습니다. 일반적으로 이것은 복제의 영역 밖에서도 적절한 방식으로하지 않습니다. 이 문제에 대한 자세한 설명은 섹션 B.5.8 "MySQL의 알려진 문제" 를 참조하십시오.
복제 슬레이브에 의해 유지되는 로그 내용은 섹션 17.2.2 "복제 릴레이 및 상태 로그" 를 참조하십시오.