Eu tenho um log de retransmissão corrompido no MySQL 5.0 e estou procurando as etapas para corrigir a replicação sem ter que reprocessar todos os logs binários do mestre novamente.
Aqui está a mensagem de erro completa se você estiver curioso:
Não foi possível analisar a entrada de evento do log de retransmissão. As possíveis razões são: o log binário do master está corrompido (você pode verificar isso executando 'mysqlbinlog' no log binário), o relay log do slave está corrompido (você pode verificar isso executando 'mysqlbinlog' no relay log), um problema de rede ou um bug no código MySQL do mestre ou escravo. Se você quiser verificar o log binário do master ou o relay log do slave, você poderá saber seus nomes emitindo 'SHOW SLAVE STATUS' neste slave.
A correção normal é bastante fácil, você apenas obtém o nome de log binário correto e a posição de show slave status e executa o comando change master. Mas não é isso que eu gostaria de fazer.
Gostaria de reprocessar apenas um ou alguns logs binários do mestre para recuperar o log de retransmissão corrompido e continuar a usar os logs de retransmissão que já foram criados. Estou procurando alguém que tenha experiência anterior em fazer isso, pois há um potencial de falhas ao fazer a recuperação dessa maneira.
Conceitualmente, estou pensando que as seguintes etapas podem ser necessárias (talvez algumas delas sejam opcionais):
- Pare a replicação no escravo.
- Encerre a instância escrava.
- Mova os logs de retransmissão para um local seguro.
- Veja se os arquivos relay-log.info ou master.info precisam ser atualizados manualmente.
- Inicie a instância escrava.
- Execute o comando change master e reprocesse os logs binários da posição com falha.
- Aguarde até que o próximo log de retransmissão seja criado.
- Pare a replicação no escravo.
- Encerre a instância escrava.
- Descubra como substituir o segundo arquivo de log de retransmissão por arquivos de log de retransmissão que estão no local seguro e mova-os para lá.
- Veja se os arquivos relay-log.info ou master.info precisam ser atualizados manualmente.
- Inicie a instância escrava.
- Espere o melhor.
Estou pensando em um método alternativo para fazer isso, que parece muito mais simples:
- Pare a replicação no escravo.
- Encerre a instância escrava.
- Mova os logs de retransmissão para um local seguro.
- Inicie a instância escrava.
- Execute o comando change master e reprocesse os logs binários da posição com falha.
- Aguarde até que o próximo log de retransmissão seja criado.
- Pare a replicação no escravo.
- Use mysqlbinlog para processar os logs de retransmissão que estão no local seguro, canalizando para o cliente mysql. Identifique em qual arquivo e posição começar. (Possibilidade de problemas, a menos que o processamento seja interrompido no primeiro erro).
- Defina o escravo para replicar a partir do mestre na posição/arquivo de log mestre lido.
Existe uma abordagem mais estável que você pode tentar
Aqui está algo para lembrar
Sempre que você executar
CHANGE MASTER TO
, ele apagará todos os logs de retransmissão que você tiver. Você não deseja manter logs de retransmissão de comandos nos quais ainda não executou nenhum SQLA seguir, um trecho retirado de uma postagem que fiz em 03 de fevereiro de 2012: Como resolver o desligamento/indisponibilidade do servidor mestre no mysql com replicação mestre-escravo :
O que você quer são duas coisas:
No seu caso, você deve usar o segundo conjunto de Coordenadas de Replicação
Relay_Master_Log_File
Exec_Master_Log_Pos
É fácil desconfiar de um log de retransmissão corrompido, conforme mostrado na mensagem de erro. O que mais dói é um Master Log corrompido. Você terá que pular obstáculos, se for esse o caso. Por outro lado, se uma das outras situações foi o motivo do log de retransmissão corrompido, a abordagem mais simples e concisa é a que afirmei.
Para ter certeza, o que quer que seja relatado para
Relay_Master_Log_File
, se esse log binário específico ainda existir no mestre, execute um mysqlbinlog nele. Se ele despejar totalmente sem caracteres corrompidos, vá em frente e use o segundo conjunto de coordenadas de replicação.Do meu mesmo post anterior
observe que as Coordenadas de replicação do
SHOW SLAVE STATUS\G
que foi executado pela última vez são(mysql-bin.000254,858190247)
. OCHANGE MASTER TO
comando neste caso seria:De uma chance !!!
ATUALIZAÇÃO 2012-09-14 16:38 EDT
Se você está preocupado com os logs de retransmissão de armazenamento, apenas limite os logs de retransmissão. Em
SHOW SLAVE STATUS\G
, existe um campo chamadoRelay_Log_Space
. Isso fornece a soma de todos os tamanhos de relé em bytes. Você sabia que poderia colocar um limite nesse número?A opção é chamada relay_log_space_limit .
Por exemplo, se você deseja limitar o número total de bytes para 10G, faça o seguinte
PASSO 01) Adicione isto ao /etc/my.cnf no Slave
PASSO 02) Executar
service mysql restart
no Escravoe é isso !!!
Quando o relé mais antigo tiver todas as suas entradas processadas, ele é deletado e um novo log de relé é criado. Isso é preenchido até que todos os logs de retransmissão somem 10G. Essa é a única maneira de controlar problemas de espaço de log de retransmissão descontrolada.
ATUALIZAÇÃO 2012-09-14 18:10 EDT
SUGESTÃO: Se você fizer backups mysqldump dos dados no Escravo a cada meia-noite, poderá configurar o seguinte para restringir ter 1 TB de logs binários:
PASSO 01) Adicione isto ao /etc/my.cnf no Master
PASSO 02) Execute esta consulta no Mestre
PASSO 03)
service mysql restart
no MestrePASSO 04) Adicione um script de backup mysqldump a um crontab no Slave
Isso tornará o Slave mais útil e controlará o excesso de logs binários para se preocupar
Para resolver o problema de pouco espaço em disco para logs binários no mestre, movi os logs binários para outra montagem de disco e, em seguida, criei links simbólicos para eles, para que o mestre soubesse onde encontrá-los. Links simbólicos podem ser criados com "ln -s" ou "cp -s".
Exemplo:
No slave, para evitar desperdício de recursos de rede, usei a configuração que Rolando sugeriu - relay_log_space_limit. Isso foi útil porque os logs de retransmissão foram corrompidos várias vezes antes que o escravo finalmente alcançasse várias transações no mestre.
Usei um método diferente para resolver o problema do que inicialmente explorei. As soluções que eu estava explorando parecem complicadas e há risco de perda de dados com elas. Embora, mais tarde, descobri que algumas das etapas que estava tentando alcançar são suportadas usando o comando CHANGE MASTER para ler o relé do próprio servidor ou os logs binários. Mas isso é apenas uma peça do quebra-cabeça. Com o MySQL 5.5 tendo somas de verificação de replicação e outros recursos, talvez eu não precise descobrir isso se atualizar para 5.5.
Os manuais do MySQL em http://dev.mysql.com/doc/refman/5.0/en/change-master-to.html dizem:
O método a seguir deve funcionar em teoria, o principal problema é descobrir corretamente de qual posição parar o processamento do(s) log(s) de retransmissão recém-criado(s) e em que posição iniciar o processamento dos logs de retransmissão salvos. Outro problema é identificar qual log/posição usar do mestre se houver mais logs de retransmissão corrompidos.