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"에 대한 모든 변경 사항을 적용하도록합니다.
복제가 너무 높은 수준에서 실행되면 내 트리거에 의해 실행되는 업데이트가 전혀 표시되지 않습니다.이 경우에는 원하는만큼의 해킹이 발생하지 않습니다.
이 작업을 수행하는 방법에 대한 도움은 크게 감사하겠습니다.
보관 된 기능으로 인해 문장 실행하고 로그에 표시 할 때의 순서의 불일치 바이너리 로그에서 불일치를 방지하기 위해 실행하기 전에 테이블 잠금을 획득 :이 그것과 뭔가를 가질 수
기본적으로 절대 안전한 방법은 데이터베이스를 업데이트하고, 복제 된 데이터베이스에서 트리거 또는 저장 기능이있는 경우, 그들은 또한 존재해야합니다 슬레이브 데이터베이스에서. 트리거와 함수를 작성하여 스스로 복제 할 수있는 방법에 대한 제한도 있습니다. – Chris