Pergunta

Estou executando um par de bancos de dados em MySQL 5.0.45 e estou tentando obter meu banco de dados legado para sincronia com um esquema revisto, para que eu possa executar os dois lado a lado. Estou fazendo isso pela adição de gatilhos para o novo banco de dados, mas eu estou correndo em problemas com a replicação. Minha configuração é a seguinte.

Servidor "mestre"

  • Banco de Dados "legacydb", replica para o servidor "escravo".
  • Banco de Dados "newdb", tem gatilhos que atualizar "legacydb" e sem replicação.

Servidor "escravo"

  • Banco de Dados "legacydb"

As minhas atualizações "newdb" fino prazo, e partiu meus gatilhos. Eles atualizar "legacydb" no servidor "mestre". No entanto, as alterações não são replicadas para baixo para os escravos. Os docs MySQL dizer que para olhares replicação simplicidade no contexto banco de dados atual (por exemplo "SELECT DATABASE();") ao decidir que as consultas para replicar em vez de olhar para o produto da consulta. Meu gatilho é executado a partir do contexto do banco de dados "newdb", de modo a replicação ignora as atualizações.

Eu tentei mover a instrução de atualização para um procedimento armazenado em "legacydb". Esta multa obras (isto é, repetições de dados para escravo), quando eu ligar para o "mestre" e "USE newdb; CALL legacydb.do_update('Foobar', 1, 2, 3, 4);" executar manualmente. No entanto, quando este procedimento é chamado de um gatilho não replicar.

Até agora o meu pensamento sobre como corrigir este tem sido um dos seguintes.

  • Força o gatilho para definir um novo banco de dados atual. Isso seria mais fácil, mas eu não acho que isso é possível. Isto é o que eu esperava alcançar com o procedimento armazenado.

  • Replicar ambos bancos de dados, e têm gatilhos em ambos mestre e escravo. Isso seria possível, mas uma dor de configurar.

  • Força a replicação para pegar todas as alterações "legacydb", independentemente do contexto do banco de dados atual.

  • Se corridas de replicação em muito alto nível, ele nunca vai mesmo ver nenhuma atualização dirigido por meu gatilho, caso em que nenhuma quantidade de hackers vai conseguir o que eu quero.

Qualquer ajuda sobre como conseguir isso seria muito apreciado.

Foi útil?

Solução

Isso pode ter algo a ver com isso:

A função armazenada adquire bloqueios de tabela antes de executar, a inconsistência evitar no log binário devido à incompatibilidade da ordem em que as instruções executar e quando eles aparecem no log. Declarações que invocam uma função são registradas em vez das instruções executadas dentro da função. Consequentemente, as funções armazenadas que atualizam as mesmas tabelas subjacentes não executar em paralelo.

Em contraste, os procedimentos armazenados não adquirir bloqueios no nível de tabela. Todos os comandos executados dentro de procedimentos armazenados são escritos no log binário.

Além disso, há toda uma lista de problemas com Triggers: http://dev.mysql.com/doc/refman/ 5.0 / en / rotina de restrictions.html

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top