Reinicie la replicación mysql después de sql_error

8

Tengo dos servidores mysql, uno maestro y otro esclavo.

Alguien pasó al esclavo y creó una tabla, luego pasó al maestro y creó la misma tabla. Por supuesto, esta declaración DDL fue replicada en el esclavo, causando un error, haciendo que la replicación se detenga en el punto del error.

¿Cómo debo reiniciar el proceso de replicación después de soltar la tabla en el esclavo o iniciar la replicación después de esa declaración?

Mostrar salida de estado esclavo:

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
fuente

Respuestas:

15

Puede usar los siguientes comandos (en el indicador de mysql):

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

El valor 1representa el número de declaraciones a omitir. Puede hacerlo varias veces hasta que se repare la replicación. Puedes ver esta página .

Khaled
fuente
2
+1 Lo he usado muchas veces, sin embargo, es importante entender lo que estás haciendo cuando ejecutas esto. Puede conducir a problemas de integridad de datos. En los casos en que se ha cargado un archivo de volcado en la casilla incorrecta (es decir, esclavo no maestro), me he saltado cientos de consultas (¡después de haber verificado esto, esto no hará daño!). Esto puede evitar el proceso de volver a configurar toda la replicación nuevamente.
Coops
Sí, tiene usted razón. Esto debe hacerse con cuidado. Es útil en caso de que tenga una consulta no válida que detuvo la replicación. Puedes saltearlo. También puede verificar las tablas relevantes después de esto para asegurarse de no perder datos entre el maestro y el esclavo.
Khaled
3

Usted no Efectivamente, debe configurar la replicación nuevamente desde cero como lo hizo la primera vez, porque si simplemente omite las declaraciones, podría perder integridad. Para estar seguro, debe replicar desde un punto de partida seguro conocido.

  • Bloquear el maestro
  • Volcar los datos usando --master-data y anotando las coordenadas de binlog (por ejemplo, mostrar estado maestro)
  • Desbloquea al maestro
  • Cargue el basurero en el esclavo
  • Comience a esclavizar usando 'change master' y las coordenadas de binlog que registró anteriormente
dotplus
fuente