- Versão principal: 5.5.13-1
- Versão escrava: 5.5.14-1
- Formato de registro binário: MIXED
Meu banco de dados Escravo (~ 40 GB) está fora de sincronia com o Mestre. Não consigo encontrar nada interessante no log de erros. Google me dá um link muito útil .
Vou sincronizar novamente o banco de dados, siga esta instrução para minimizar o tempo de inatividade no mestre. Mas antes de fazer isso, só quero ter certeza de que essa situação será limitada no futuro. Vou examinar as partes acima para mostrar o que fiz:
- O banco de dados escravo foi configurado com a
read-only
opção - Há algumas consultas inseguras. Ele apresenta alguns problemas com a replicação baseada em MIXED?
- Eu repliquei todos os bancos de dados
- Eu usei os mecanismos de armazenamento InnoDB e MyISAM
- Os desenvolvedores usam muitas tabelas temporárias
Eu devo:
- Não use as consultas inseguras
- Peça aos desenvolvedores que coloquem todas as tabelas temporárias em um banco de dados separado
Mais alguma coisa? Em caso de dessincronização, é mk-table-sync
confiável o suficiente para ressincronizar automaticamente? Alguém usa na produção?
ATUALIZAÇÃO: terça-feira, 28 de fevereiro 23:27:13 ICT 2012
Meu banco de dados Escravo (~ 40 GB) está fora de sincronia com o Mestre. Não consigo encontrar nada interessante no log de erros.
Para obter mais informações sobre o que estava acontecendo, o Slave deve ser iniciado com --log-warnings=2
.
OBSERVAÇÃO #1
Você mencionou que os desenvolvedores do Ask colocam todas as tabelas temporárias em um banco de dados separado
Se seus desenvolvedores estiverem usando comandos CREATE TEMPORARY TABLE para criar tabelas temporárias, eles precisarão usar CREATE TABLE. Aqui está o porquê:
Com o MySQL Replication processando uma tabela temporária, é isso que ocorre
CREATE TEMPORARY TABLE
CREATE TEMPORARY TABLE
De vez em quando, alguém pode
STOP SLAVE;
executar um backup. SeSTOP SLAVE;
for emitido logo após a etapa 4, a temperatura criada desaparece e seus dados também. Quando você executaSTART SLAVE;
quebras de replicação reclamando instantaneamente que a tabela não existe. Isso é normal porque quando uma conexão de banco de dados termina deliberadamente ou acidentalmente, todas as tabelas temporárias abertasCREATE TEMPORARY TABLE
na sessão de banco de dados são descartadas. ExecutandoSTOP SLAVE;
kill do thread SQL que estava segurando a abertura da tabela temporária.A única solução para isso é criar a tabela usando
CREATE TABLE
em vez deCREATE TEMPORARY TABLE
. Quando executadoSTOP SLAVE;
, a tabela temporária que você criou normalmente não desaparece.Eu vi isso acontecer talvez 10 vezes em minha carreira de DBA. Consertá-lo usando os logs binários para descobrir o nome das tabelas temporárias, para criar essas tabelas usando
CREATE TABLE
, então iniciar a replicação foi a única manutenção possível sem apenas força bruta copiando o mestre.OBSERVAÇÃO #2
mk-table-sync
só funciona em tabelas com chaves primárias e/ou chaves únicas. Funciona talvez 99% do tempo. Já vi casos em que a soma de verificação de uma tabela no mestre e no escravo eram diferentes. Eu rodariamk-table-sync
, ainda havia diferenças (Claro, eu estava fazendomk-table-sync
em replicação circular com 3 masters, o que pode ser um pouco perigoso. Usar em Master/Slave é bem mais estável)OBSERVAÇÃO #3
Você mencionou que existem algumas consultas inseguras. Ele apresenta alguns problemas com a replicação baseada em MIXED?
Depende. A consulta insegura mais popular é qualquer UPDATE ou DELETE que usa
ORDER BY ... LIMIT
. Com o SBR, isso pode fazer com que o MySQL atualize ou exclua linhas de uma tabela no escravo em uma ordem diferente da do mestre. Com RBR, acredito que as mudanças exatas em uma linha são mais identificáveis para UPDATE ou DELETE no Slave.SOLUÇÃO : Evite usar consultas inseguras. Então, você não vai se preocupar !!!
OBSERVAÇÃO #4
Acabei de ler seu segundo link. ROF!!! Estou familiarizado com o pôster da resposta.