Mestre do MySQL - Mestre Quebrado

4

Eu herdei um sistema master master do Mysql, eu notei que o segundo mestre (vamos chamá-lo de escravo a partir de agora enquanto está rodando em uma máquina 'slave') parou de ter seu banco de dados atualizado. Vi que

Mestre:

Slave_IO_Running: Yes
Slave_SQL_Running: Yes

Escravo: (com um erro truncado)

Slave_IO_Running: Yes
Slave_SQL_Running: No
Last_Errno: 1062
Last_Error: Error 'Duplicate entry '3' for key 'PRIMARY'' on [...]

Eu não sei o que o levou a processar, considerando que não podemos duplicar lá. O importante é retomar as operações normais;

Neste momento, tenho stop slave; no mestre e stop slave; no escravo porque vi que, se eu alterar os registros no escravo, as alterações serão propagadas para o mestre em uso ativo.

Como faço: Forçar sincronia TUDO de mestre para escravo sem afetar os dados no mestre? Então esperamos que a replicação de captação de escravos, como de costume?

UPDATE OK Eu tentei apagar todas as tabelas no escravo, em seguida, ele reclamou nessa seção de erro que a "tabela" não existe. Então, eu fiz um dump sem dados do Mestre e me certifiquei de ter apenas tabelas vazias no Secondary (escravo). Eu start slave; no escravo, mas agora está reclamando de instruções sangrentas alter table, por exemplo:

Last_Errno: 1060
Last_Error: Error 'Duplicate column name [...] Query: 'ALTER TABLE [...]

Como pular as instruções alteradas do fracking Eu só quero replicar os dados sangrentos e acabar com isso, minhas tabelas já possuem as mudanças já FFS e agora estão reclamando das mudanças feitas após a replicação apreendida semanas atrás

Como faço para redefinir o log ou algo assim?

EXCEPCIONAL Por que isso iria começar a acontecer? O "Secondary" está se propagando para "Primary". "Principal" não está se propagando para "Secundário". Mas qualquer correção que eu tentei deixou no mesmo estado Sim-Sim Sim-Não com o mesmo Last_Error. Eu acho que na época em que o servidor foi retirado da rede, isso poderia confundir o MySQL de alguma forma?

    
por Recct 19.12.2012 / 18:24

1 resposta

1

Primeiro você precisa entender que a replicação do MySQL apenas sincroniza os CHANGES. Esvaziar as tabelas (ou excluí-las) não fará com que os dados sejam replicados novamente. Você tem que iniciar o escravo com um conjunto consistente de arquivos de dados.

O processo difícil de repagar seu escravo é o seguinte: (não siga estas instruções)

  1. Obtenha um instantâneo consistente dos seus dados.
  2. Copie o instantâneo para o escravo.
  3. Reconfigure e inicie o escravo.

Se você não consegue tolerar o tempo de inatividade, existem duas maneiras de fazer isso.

  • Se os dados forem pequenos o suficiente para que você possa mysqldump tudo, incluindo os dados, estas instruções são boas . Se você tiver vários bancos de dados, leia o artigo, pois não vou replicar essas considerações aqui. Mas se você tiver apenas 1 banco de dados, os passos básicos são:

    1. No mestre, faça backup do banco de dados da seguinte forma: mysqldump -u root -e -q --single-transaction --master-data database_name
    2. Importe este backup para o seu escravo.
    3. Observe o início do arquivo de backup para obter o nome e a posição do registro principal.
    4. No escravo no shell mysql, execute algo parecido com isto, mas atualize com as informações da etapa 3: START SLAVE UNTIL MASTER_LOG_FILE='bin.000029', MASTER_LOG_POS=651322976;


  • Se os seus bancos de dados são muito grandes para o mysql dump, você precisará fazer um snapshot de suas tabelas usando os recursos de instantâneos de volume do seu sistema operacional. Isso irá pausar seu servidor MySQL por alguns segundos, então é melhor fazê-lo depois de horas, quando isso provavelmente não irá incomodar ninguém.

    1. No mestre no shell mysql, use um bloqueio de gravação em todas as tabelas para torná-las consistentes usando flush tables with write lock . Isso efetivamente pausará o servidor.
    2. Não saia da shell do mysql ou perderá o seu bloqueio.
    3. Em outro shell do SO, tire um instantâneo do volume de dados do mysql.
    4. De volta ao shell do mysql: SHOW MASTER STATUS para obter a posição atual do log, então UNLOCK TABLES para liberar o bloqueio. O servidor está agora sem pausa.
    5. Acesse o instantâneo e copie os arquivos de dados mysql para o escravo.
    6. No escravo no shell mysql, execute algo como isto, mas atualize com as informações da etapa # 4: START SLAVE UNTIL MASTER_LOG_FILE='bin.000029', MASTER_LOG_POS=651322976;
por 19.12.2012 / 20:03