2008-09-19 4 views
4

MySQL 5.0.45에서 몇 가지 데이터베이스를 실행 중이고 레거시 데이터베이스를 개정 된 스키마와 동기화하려고 시도하고 있으므로 두 가지를 모두 실행할 수 있습니다. 새 데이터베이스에 트리거를 추가하여이 작업을 수행하고 있지만 복제에 문제가 있습니다. 내 설정은 다음과 같습니다.여러 데이터베이스를 사용하는 MySQL 트리거 + 복제

서버 "마스터"

  • 데이터베이스 "legacydb는", "노예"서버에 복제합니다.
  • 데이터베이스 "newdb"에 "legacydb"를 업데이트하고 복제하지 않는 트리거가 있습니다.

내 업데이트 "legacydb"

서버 "노예"

  • 데이터베이스는 "한 newdb"잘 실행, 내 트리거를 설정합니다. 그들은 "master"서버에서 "legacydb"를 업데이트합니다. 그러나 변경 사항은 슬레이브로 복제되지 않습니다. MySQL의 문서에 따르면 단순화를 위해 쿼리의 제품을보기보다는 복제 할 쿼리를 결정할 때 현재 데이터베이스 컨텍스트 (예 : "SELECT DATABASE();")를 살펴 봅니다. 내 트리거는 데이터베이스 "newdb"의 컨텍스트에서 실행되므로 복제는 업데이트를 무시합니다.

    "legacydb"의 저장 프로 시저로 업데이트 문을 이동하려고했습니다. "마스터"에 연결하고 수동으로 "USE newdb; CALL legacydb.do_update('Foobar', 1, 2, 3, 4);"을 실행하면 정상적으로 작동합니다 (즉, 데이터가 슬레이브에 복제 됨). 그러나이 프로 시저가 트리거에서 호출 될 때 복제하지 않습니다.

    지금까지이 문제를 해결하는 방법에 대한 내 생각은 다음 중 하나였습니다.

    • 강제로 트리거가 현재 데이터베이스를 새로 설정합니다. 이것은 가장 쉬울 것이지만 이것이 가능하다고 생각하지 않습니다. 이것이 내가 스토어드 프로 시저로 달성하기를 원하는 것입니다.

    • 두 데이터베이스를 모두 복제하고 마스터와 슬레이브에서 모두 트리거합니다. 이것은 가능할 것이지만 고통을 일으킬 것입니다.

    • 현재 데이터베이스 컨텍스트에 관계없이 복제가 "legacydb"에 대한 모든 변경 사항을 적용하도록합니다.

    • 복제가 너무 높은 수준에서 실행되면 내 트리거에 의해 실행되는 업데이트가 전혀 표시되지 않습니다.이 경우에는 원하는만큼의 해킹이 발생하지 않습니다.

    이 작업을 수행하는 방법에 대한 도움은 크게 감사하겠습니다.

    보관 된 기능으로 인해 문장 실행하고 로그에 표시 할 때의 순서의 불일치 바이너리 로그에서 불일치를 방지하기 위해 실행하기 전에 테이블 잠금을 획득 :이 그것과 뭔가를 가질 수

답변

3

. 함수를 호출하는 명령문은 함수 내에서 실행되는 명령문이 아니라 기록됩니다. 결과적으로 동일한 기본 테이블을 갱신하는 저장 함수는 병렬로 실행되지 않습니다.

반면 저장 프로시 저는 테이블 수준 잠금을 획득하지 않습니다. 저장 프로시 듀어 내에서 실행되는 모든 명령.은 2 진 로그에 기록됩니다.

는 또한, 트리거와 관련된 문제의 전체 목록이 있습니다 : 는 http://dev.mysql.com/doc/refman/5.0/en/routine-restrictions.html

+0

기본적으로 절대 안전한 방법은 데이터베이스를 업데이트하고, 복제 된 데이터베이스에서 트리거 또는 저장 기능이있는 경우, 그들은 또한 존재해야합니다 슬레이브 데이터베이스에서. 트리거와 함수를 작성하여 스스로 복제 할 수있는 방법에 대한 제한도 있습니다. – Chris