Broken Slave (replicação do MySQL)

1

Ontem à noite, um dos desenvolvedores executou uma instrução mySQL incorreta (Consulta inserindo uma linha com chave primária duplicada) na máquina master. De repente, a replicação para seu escravo parou. Slave começou a escrevê-lo para mysql_relay_logs e antes que pudéssemos monitorar e consertar, o disco ficou sem espaço.

O mestre está configurado para salvar bin_logs nos últimos três dias, por isso ainda não perdemos completamente a replicação. Alguém pode me ajudar a consertar essa bagunça agora?

Meu status mestre:

mysql> SHOW MASTER STATUS\G
*************************** 1. row ***************************
File: mysql-bin.000017
Position: 30844254
Binlog_Do_DB: 
Binlog_Ignore_DB: 
1 row in set (0.00 sec)

Status do escravo: mysql

> SHOW SLAVE STATUS\G
*************************** 1. row ***************************
             Slave_IO_State: 
                Master_Host: 192.168.140.110
                Master_User: replication_user
                Master_Port: 3306
              Connect_Retry: 60
            Master_Log_File: mysql-bin.000014
        Read_Master_Log_Pos: 61132382
             Relay_Log_File: mysqld-relay-bin.000037
              Relay_Log_Pos: 1405976
      Relay_Master_Log_File: mysql-bin.000014
           Slave_IO_Running: No
          Slave_SQL_Running: No
            Replicate_Do_DB: 
        Replicate_Ignore_DB: 
         Replicate_Do_Table: 
     Replicate_Ignore_Table: 
    Replicate_Wild_Do_Table: 
Replicate_Wild_Ignore_Table: 
                 Last_Errno: 1062
                 Last_Error: Error 'Duplicate entry '13676-1-2' for key 1' on query. Default database: 'XXX'. Query: 'YYY'
               Skip_Counter: 0
        Exec_Master_Log_Pos: 1405839
            Relay_Log_Space: 8974037551
            Until_Condition: None
             Until_Log_File: 
              Until_Log_Pos: 0
         Master_SSL_Allowed: No
         Master_SSL_CA_File: 
         Master_SSL_CA_Path: 
            Master_SSL_Cert: 
          Master_SSL_Cipher: 
             Master_SSL_Key: 
      Seconds_Behind_Master: NULL
1 row in set (0.00 sec)

Alguém pode me dar comandos exatos para fazer tudo voltar ao normal? Como eu disse, tenho certeza de que perdemos dados sobre o escravo enquanto ele ficou sem disco, mas precisamos ter dados sobre o mestre.

Minha próxima pergunta é: como garantir que isso não aconteça novamente.

Obrigado uma tonelada Sparsh Gupta

    
por Sparsh Gupta 22.10.2011 / 09:19

2 respostas

4

O curso de ação direto é eliminar os dados do escravo e começar de novo com uma nova cópia do mestre. O mestre pode ser copiado usando o mysqldump ou através de algo como o rsync. Dependendo de quão grande é seu banco de dados, você pode enfrentar o tempo de inatividade. Isso sempre funcionará.

Há uma chance de que, se você limpar o espaço da unidade escrava, possa iniciar a replicação de onde o erro ocorreu usando (de dentro do mysql):

start slave

Se o arquivo bin.log do mestre estiver no lugar, há uma chance de a replicação iniciar imediatamente. Eu não tive muitas experiências onde isso aconteceu.

A última vez que fiz isso foi quando um desenvolvedor adicionou uma nova tabela a um banco de dados e não a criou primeiro no escravo. Eu criei a tabela e tive que usar sql_slave_skip_counter para pular os bits que foram perdidos do bin.log. Eu então inseri manualmente as 20 linhas de dados que eu tinha pulado.

    
por 22.10.2011 / 12:20
4

apenas pare o escravo, e pule a instrução sql que faz a entrada duplicada usando ( link )

mysql> stop slave;
mysql> SET GLOBAL sql_slave_skip_counter = 1;
mysql> start slave;

se o erro for diferente depois de executar o comando acima, basta repeti-lo novamente até que o escravo esteja funcionando. mas se esta maneira não funcionar, você deve recriar o escravo desde o começo.

    
por 22.10.2011 / 14:23