2010-07-11 2 views
2

발생할 수있는 DDL 문을 포함하여 MySQL 데이터베이스의 모든 변경 사항을 기록하고 원격 데이터베이스와 동기화 할 수있는 정보를 사용할 수 있는지 조사하고 있습니다. .T-SQL을 사용하여 모든 MySQL binlog 이벤트 정보를 얻는 방법

응용 프로그램 자체는 C#으로 작성되었으므로 지금까지 보아 왔던 최상의 동기화 기술은 Microsoft Sync Framework입니다. 이 프레임 워크 자체는 삭제 된 행을 저장하기 위해 트리거와 추가 테이블을 추가하여 DB에 대한 변경 사항을 추적하는 솔루션을 제안합니다.

4 개 이상의 제품에서 사용되는 표준 DB의 스키마를 변경해야하므로 내 생각에는 좋지 않은 것 같습니다. 이 방법은 또한 각 테이블의 삭제 된 행에 대해 새 테이블을 추가하여 테이블의 수를 두 배로 늘리므로 좋지 않습니다.

다른 측면에서 MySQL은 모든 변경 사항을 추적하고 소위 혼합 모드를 사용하여 대부분의 경우 명령문을 추적 할 수있는 위대한 binlog를 가지고 있습니다 (따라서 원격 DB에서 다시 실행하여 데이터를 복제 할 수 있습니다) (NOW()와 같이) 비 결정적 함수가 호출 될 때 원시 데이터가 업데이트되므로 두 위치에서 업데이트 된 데이터가 동일합니다. 1) 'SHOW 바이너리 로그의 이벤트'

옵션 2는 또 다른 호출이 필요하지 않기 때문에 나에게 더 나은 것 같다 호출에서 mysqlbinlog 유틸리티 2) :

또한이 데이터를 검색 할 2 개 표준 방법이있을 것 같다 외부 응용 프로그램을 실행하고 DB 시스템에서 응용 프로그램을 실행하지만 기록 된 ROW 형식 명령문 (table_id : 47 flags : STMT_END_F는 아무 것도 알려주지 않음)의 실제 데이터는 포함하지 않습니다.

그래서 결국 내 질문은 :

  1. 전체 구조를 변경하고 트리거 및 테이블의 톤을 추가하지 않고 MySQL의 DB에 변경 사항을 추적 할 수있는 더 나은 방법이 있나요? 제품을 변경하여 변경 사항을 기록 할 수 있지만이 로그를 사용하여 모든 제품을 변경해야만 모든 것을 기록 할 수 있습니다. 모든 사람을 설득하는 것은 거의 불가능하다고 생각합니다.

  2. SHOW BINLOG EVENTS를 사용하여 변경 한 사항에 대한 모든 정보를 얻을 수 있습니까? 행 데이터 포함.

P. 필자는 MySQL 프록시도 연구했지만, 모든 경우에 로깅 스테이트먼트의 문제는 비 결정적 함수의 실제 데이터가 포함되어 있지 않다는 것입니다.

답변

0

옵션 3은 응용 프로그램 내에서 직접 bin 로그를 구문 분석하여 사용자가 확인하는 빈도를 완전히 제어 할 수 있으며 사용 된 실제 값이있는 모든 명령문을 볼 수 있습니다.

+0

네,하지만이 문제는 MySQL이 바이너리 로그 파일의 여러 버전을 가지고 있고 계속 변경되고 있다는 것입니다 ... 옵션 4가 가장 좋을 것입니다. MySQL 5.5에서는 트랜잭션을 커밋 할 때 슬레이브에게 신호를 보내는 반 동기 복제 (semi-synchronous replication)가있다. 슬레이브를 모방 할 수있는 응용 프로그램을 작성하고 전체 트랜잭션이 포함 된 메시지를 기다리는 것이 가능합니다. 불행하게도 5.5는 일반적으로 사용할 수 없으며이 옵션은 여전히 ​​Linux에서만 사용할 수 있습니다. – flipm0de