Reinicie a replicação do mysql após sql_error

8

Eu tenho dois servidores mysql, um mestre e um escravo.

Alguém foi até o escravo e criou uma mesa; depois, seguiu para o mestre e criou a mesma mesa. Obviamente, essa instrução DDL foi replicada para o escravo, causando um erro, causando a parada da replicação no ponto do erro.

Como devo reiniciar o processo de replicação após descartar a tabela no escravo ou iniciar a replicação após essa instrução?

mostre a saída do status do escravo:

mysql> show slave status \G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: xx.xx.xx.xx
                  Master_User: buildbot
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.024536
          Read_Master_Log_Pos: 33489509
               Relay_Log_File: mysqld-relay-bin.049047
                Relay_Log_Pos: 32575097
        Relay_Master_Log_File: mysql-bin.024476
             Slave_IO_Running: Yes
            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: 1050
                   Last_Error: Error 'Table 'checklist' already exists' on query. Default database: 'dbname'. Query: 'CREATE TABLE `checklist` (
  `checklist_id` int(11) NOT NULL AUTO_INCREMENT,
  `description` varchar(768) NOT NULL,
  `url` varchar(512) NOT NULL,
  `active` bit(1) NOT NULL,
  `insert_date` datetime NOT NULL,
  `xcred` int(11) NOT NULL,
  PRIMARY KEY (`checklist_id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=latin1'
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 32574952
              Relay_Log_Space: 6766519525
              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
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 2013
                Last_IO_Error: error reconnecting to master '[email protected]:3306' - retry-time: 60  retries: 86400
               Last_SQL_Errno: 1050
               Last_SQL_Error: Error 'Table 'checklist' already exists' on query. Default database: 'dbname'. Query: 'CREATE TABLE `checklist` (
  `checklist_id` int(11) NOT NULL AUTO_INCREMENT,
  `description` varchar(768) NOT NULL,
  `url` varchar(512) NOT NULL,
  `active` bit(1) NOT NULL,
  `insert_date` datetime NOT NULL,
  `xcred` int(11) NOT NULL,
  PRIMARY KEY (`checklist_id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=latin1'
ʞɔıu
fonte

Respostas:

15

Você pode usar os seguintes comandos (no prompt do mysql):

mysql> STOP SLAVE;
mysql> SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;
mysql> START SLAVE;
mysql> SHOW SLAVE STATUS;

O valor 1representa o número de instruções a serem ignoradas. Você pode fazer isso repetidamente até que a replicação seja corrigida. Você pode ver esta página .

Khaled
fonte
2
+1 Eu usei isso muitas vezes, no entanto, é importante entender o que você está fazendo quando executa isso. Isso pode levar a problemas de integridade de dados. Nos casos em que um arquivo de despejo foi carregado na caixa errada (por exemplo, escravo, não mestre), pulei centenas de consultas (depois de verificar isso, não fará mal!). Isso pode evitar o processo de redefinição de toda a replicação novamente.
Coops
Sim você está certo. Isso deve ser feito com cuidado. É útil caso você tenha uma consulta inválida que interrompeu a replicação. Você pode simplesmente pular. Você também pode verificar as tabelas relevantes após isso para garantir que não perdeu dados entre mestre e escravo.
Khaled
3

Você não Efetivamente, você precisa configurar a replicação novamente do zero, como fez na primeira vez, porque se você simplesmente pular instruções, poderá perder a integridade. Para estar seguro, você deve replicar a partir de um ponto de partida seguro conhecido.

  • Bloquear o mestre
  • Despejar os dados usando --master-data e anotando as coordenadas do binlog (por exemplo, mostrar status do mestre)
  • Desbloqueie o mestre
  • Carregar o despejo no escravo
  • Comece a escravizar usando 'alterar mestre' e as coordenadas do binlog que você gravou anteriormente
dotplus
fonte