문제

저는 MySQL 5.0.45에서 두 개의 데이터베이스를 실행하고 있으며 기존 데이터베이스를 수정된 스키마와 동기화하여 두 데이터베이스를 나란히 실행할 수 있도록 노력하고 있습니다.새 데이터베이스에 트리거를 추가하여 이 작업을 수행하고 있지만 복제에 문제가 있습니다.내 설정은 다음과 같습니다.

서버 "마스터"

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

서버 "슬레이브"

  • 데이터베이스 "legacydb"

"newdb"에 대한 업데이트가 제대로 실행되고 트리거가 시작됩니다."마스터" 서버에서 "legacydb"를 업데이트합니다.그러나 변경 사항은 슬레이브에 복제되지 않습니다.MySQL 문서에서는 복제를 단순화하기 위해 현재 데이터베이스 컨텍스트(예: "SELECT DATABASE();" ) 쿼리의 결과를 보는 대신 복제할 쿼리를 결정할 때.내 트리거는 데이터베이스 "newdb"의 컨텍스트에서 실행되므로 복제는 업데이트를 무시합니다.

업데이트 문을 "legacydb"의 저장 프로시저로 이동해 보았습니다.이것은 잘 작동합니다(예:데이터가 슬레이브에 복제됨) "마스터"에 연결하고 수동으로 실행할 때 "USE newdb; CALL legacydb.do_update('Foobar', 1, 2, 3, 4);".그러나 이 프로시저가 트리거에서 호출되면 복제되지 않습니다.

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

  • 트리거가 새로운 현재 데이터베이스를 설정하도록 강제합니다.이것이 가장 쉬울 것이지만, 나는 이것이 가능하다고 생각하지 않습니다.이것이 제가 저장 프로시저를 통해 달성하고자 했던 것입니다.

  • 두 데이터베이스를 모두 복제하고 마스터와 슬레이브 모두에 ​​트리거가 있습니다.이는 가능하지만 설정하기가 어렵습니다.

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

  • 복제가 너무 높은 수준에서 실행되면 내 트리거에 의해 실행되는 업데이트가 전혀 표시되지 않습니다. 이 경우 어떤 해킹으로도 원하는 결과를 얻을 수 없습니다.

이를 달성하는 방법에 대한 도움을 주시면 대단히 감사하겠습니다.

도움이 되었습니까?

해결책

이것은 그것과 관련이 있을 수 있습니다:

저장 함수는 명령문이 실행되는 순서와 로그에 나타나는 순서의 불일치로 인한 바이너리 로그의 불일치를 방지하기 위해 실행 전에 테이블 잠금을 획득합니다.함수 내에서 실행된 명령문이 아니라 함수를 호출하는 명령문이 기록됩니다.결과적으로 동일한 기본 테이블을 업데이트하는 저장 함수는 병렬로 실행되지 않습니다.

이와 대조적으로 저장 프로시저는 테이블 수준 잠금을 획득하지 않습니다.저장 프로시저 내에서 실행된 모든 문은 바이너리 로그에 기록됩니다.

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

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top