MySQL Trigger e Replication Stored Procedure
-
01-07-2019 - |
Pergunta
Ok, eu estou correndo uma configuração com um único mestre e um número de escravos. Todas as gravações passar pelo mestre e são replicadas para baixo para os escravos que são utilizados estritamente para lê.
Agora eu tenho um procedimento armazenado (não função), que é chamado por um gatilho em uma inserção. De acordo com os documentos MySQL, para gatilhos replicação do registo da chamada para o gatilho enquanto procedimentos armazenados efectivamente registar o resultado do procedimento armazenado.
Então, minha pergunta é, quando o gatilho é demitido, vai replicar tanto o gatilho e os resultados do procedimento que chama o gatilho (resultando no procedimento efetivamente sendo executado duas vezes)? Ou ele vai simplesmente replicar o gatilho ter os escravos re-executar o procedimento armazenado por conta própria?
Graças
Solução
No MySQL 5.0 (e MySQL 5.1 com a declaração com base log binário), apenas a consulta chamando é registrado, por isso, no seu caso, o INSERT seria registrado.
No escravo, a inserção será executado e, em seguida, o gatilho será re-executar no slave. Assim, as necessidades de gatilho de existir no slave, e supondo que ele, então ele vai ser executado exatamente da mesma maneira como o mestre.
No MySQL 5.1, há o registo baseados em linha binário, que irá registrar apenas as linhas que está sendo mudado, assim que o gatilho não seria no escravo movidas a re, mas todas as linhas que mudaram ainda seria propagada.
Outras dicas
Além de excelente resposta de Harrison:
- Assumindo que os bancos de dados estão em sincronia (esquema, dados, mesma versão), para começar, ele deverá funcionar
- Se isso não acontecer, então pode ser que você está usando algo não determinista em suas consultas ou gatilho. Fix isso.
- Independentemente de como você usar a replicação, você precisa ter o controlo para verificar se os escravos estão sempre em sincronia. Sem qualquer monitoramento, eles vão se tornar fora de sincronia (sutilmente) e você não vai notar. MySQL não tem built-in automático recurso para verificar este ou corrigi-lo.