Eu fui para a primeira opção.
Isso funcionou até o ponto em que o escravo começou a tentar fazer inserções que conflitavam com as chaves primárias. O escravo tinha feito mais trabalho do que o bin-log mestre persistiu, como mencionado anteriormente. Um aspecto que eu não previ era que o escravo continha dados que não estavam no mestre; Ou seja, o escravo persistiu algumas transações antes da queda de energia que o mestre HAD NOT persistiu.
Como no meu caso, essas transações não eram relacionadas a pagamento ou similares, optei por excluir os dados do escravo (perdendo alguns dados que haviam acontecido, mas que não existiam no mestre) e depois deixar replicação executar novamente. Isso trouxe os escravos completamente atualizados. Se os dados tivessem sido mais importantes, teríamos compensações de incremento automático suficientes para nos dar algum espaço de manobra para manipular manualmente os dados e garantir que a integridade referencial não fosse comprometida. Felizmente não precisávamos fazer isso neste caso.
Para uma máquina em configuração mestre-mestre (passiva) que estava nessa situação, optei por uma abordagem semelhante. Por mestre-mestre passivo, quero dizer que temos um mestre ativo (serverA) que é onde todas as gravações vão, e um mestre passivo (serverB) que está no lugar para permitir que as atualizações de esquema ocorram com tempo de inatividade zero. Os dados no mestre ativo (serverA) foram escolhidos como os valores verdadeiros, apesar de saber que isso significava que perdíamos algumas transações persistentes que não eram consideradas importantes.
-
Alterou o arquivo de log e a posição no escravo.
CHANGE MASTER MASTER_LOG_FILE='bin-log.004713', MASTER_LOG_POS=0; -- on serverB
-
Reinicialização de escravo reinicializado no mestre passivo (serverB) até que ele falhou com violações de restrição de chave primária, como acontece com os outros escravos.
START SLAVE; -- on serverB
-
Parou a replicação de escravo do mestre passivo (serverB) para o mestre ativo (serverA).
STOP SLAVE; -- on serverA
-
DELETE as linhas no slave (serverB) que não existiam no master no serverA.
DELETE FROM SOME_TABLE WHERE ID IN (???,????); -- on serverB SHOW MASTER STATUS\G; -- get the new master log position on serverB
-
Mova a posição de execução do escravo mestre ativo (serverA) para pular as exclusões do mestre passivo (serverB).
CHANGE MASTER TO MASTER_LOG_POS=???; --on serverA; use the value just obtained from serverB
-
Reinicie a replicação no mestre ativo (serverA) e no mestre passivo.
START SLAVE; -- on both machines. serverA does nothing and serverB starts catching up.