런타임에 binlog 형식을 전환하는 가장 안전한 방법은 무엇입니까?


25

의 다음 경고로 인해 mysqld.log:

[경고] BINLOG_FORMAT = STATEMENT 이후 명령문 형식을 사용하여 이진 로그에 작성된 안전하지 않은 명령문. 이 명령문은 LIMIT 절을 사용하므로 안전하지 않습니다. 포함 된 행 집합을 예측할 수 없기 때문에 안전하지 않습니다.

복제 형식을 (으)로 전환하고 싶습니다 MIXED.

그러나 MySQL 문서에 따르면 :

명령문 기반 복제를 사용하는 경우에만 임시 테이블이 기록되는 반면, 행 기반 복제의 경우 로그가 기록되지 않으므로 임시 테이블이 존재하는 경우 런타임에 복제 형식을 전환하지 않는 것이 좋습니다.

따라서 문제는 이진 로그 형식을 안전하게 전환하기 위해 임시 테이블이 있는지 어떻게 알 수 있습니까?


1
빠른 경고. : RBR-> SBR에서 가서 읽기 최선을 다하고 사용할 때 조심 bugs.mysql.com/bug.php?id=62493
모건 Tocker

답변:


35

binlog는이 작업을 수행하는 순간에 특정 형식을 가지므로 MySQL (eh Oracle [여전히 내 언어를 풀 수 없음])이이 기능을 구축했지만 두 형식을 함께 도박하지 않기로 결정할 수 있습니다.

mysql을 다시 시작하지 않고 완전히 안전하게 재생하려면 다음을 시도하십시오.

FLUSH TABLES WITH READ LOCK;
FLUSH LOGS;
SET GLOBAL binlog_format = 'MIXED';
FLUSH LOGS;
UNLOCK TABLES;

마지막 binlog는 'MIXED'형식으로 남습니다. penultimiate (마지막으로) binlog는 이전 형식의 마지막 binlog를 닫을뿐입니다.

첫 번째 이전의 모든 기존 세션 은 FLUSH LOGS;한 번 UNLOCK TABLES;실행 된 마지막 binlog에 쓰기를 시작 합니다.

시도 해봐 !!!

경고

크레딧이 필요한 곳에 크레딧을 제공하면 제 답변은 @Jonathan의 답변 에서 실제로 피기 백됩니다 . 나는 그 위에 binlogs를 닫고 엽니 다. 그는 이것을 먼저 가져 오면 +1을받습니다.

업데이트 2011-10-12 13:58 EDT

이 작업을 활성 마스터에 수행하고 해당 마스터에서 복제하는 하나 이상의 슬레이브가있는 경우 새 형식의 릴레이 로그도 염려해야합니다. 할 수있는 일은 다음과 같습니다.

슬레이브에서 실행 STOP SLAVE;

마스터에서 다음을 실행하십시오.

FLUSH TABLES WITH READ LOCK;
FLUSH LOGS;
SET GLOBAL binlog_format = 'MIXED';
FLUSH LOGS;
UNLOCK TABLES;

슬레이브에서 실행 START SLAVE;

릴레이 로그를 실행 STOP SLAVE;하고 START SLAVE;회전하면 새 항목이 어떤 형식이든 복제됩니다. binlog_format 변경 사항을 슬레이브에도 적용 할 수 있습니다.


3
명심해야 할 것은 mysql 복제 설정이 실제로 클라이언트 세션별로 설정된다는 것입니다. 전역 binlog_format을 설정하면 새 세션의 값만 변경됩니다. 따라서 클라이언트가 지속적으로 연결된 시스템에서 실행하는 경우 여기에 지정된대로 플러시 및 잠금을 수행하더라도 설정에 대한 변경 사항은 즉시 적용되지 않습니다. 클라이언트까지 적용되지 않습니다. 다시 연결하십시오 (또는 자체 세션에서 값을 설정하지만 경험상 전자가 더 가능성이 높습니다).
Austin Mills

궁금하신 분들은이 "binlog_format = 'MIXED';" 당신의 my.cnf.
Christian

2
참고로,이 답변은 다음 답변과 일치하지 않습니다 : dba.stackexchange.com/questions/58539/…
HTTP500

수동 상태 : 이는 복제 마스터에서 로깅 형식을 변경해도 슬레이브가 로깅 형식을 일치하도록 변경하지 않음을 의미합니다. (..snip ..) 복제가 진행되는 동안 마스터에서 이진 로깅 형식을 변경하거나 슬레이브에서 변경하지 않으면 예기치 않은 결과가 발생하거나 복제가 실패 할 수도 있습니다.
Halfgaar

@Halfgaar 지난 주에, 나는 아무런 영향없이 슬레이브를 MIXED에서 STATEMENT로 3 번 바꿨다. 경쟁 조건으로 인해 복제가 중단 되었기 때문에 그렇게했습니다. 쿼리 실행 전에 슬레이브에 테이블이 존재하지 않습니다. 그래서 저는 그 상황처럼 안정적으로 진술로 전환했습니다. 물론이 작업을 수행하는 동안 모든 쓰기가 중지되었습니다. BTW 나도 스승을 했어
RolandoMySQLDBA

6

런타임에 binlog_format을 전환하려면 다음을 수행하십시오.

set global binlog_format = 'MIXED';

그러면 모든 NEW 세션이 혼합 binlog 형식이됩니다. 기존의 모든 세션은 종료 될 때까지 이전에 설정 한대로 진행됩니다.

set session binlog_format = 'MIXED';세션 관련 문제를 구체적으로 해결하기 위해 수동으로 수행 할 수도 있습니다 .


나는 길을 묻지 않고 가장 안전한 방법을 묻고 임시 테이블이 있는지 어떻게 확인할 수 있습니다.
quanta

3
전역 변수를 먼저 설정하고 나머지 세션이 완료되기를 기다리는 것이 가장 안전한 방법입니다.
Jonathan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.