systemadmin.es > DBA > Arreglar la replicación en MySQL saltando queries

Arreglar la replicación en MySQL saltando queries

En un entorno master-slave de MySQL es posible que nos encontremos que se han ejecutado en el master comandos que no se pueden trasladar al slave por algún motivo. Vamos a ver como saltarnos las queries mediante sql_slave_skip_counter

Vamos a ver un caso concreto, supongamos que en el slave nos encontramos el siguiente error en el show slave status:

mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 10.1.5.1
                  Master_User: slave
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000167
          Read_Master_Log_Pos: 411336124
               Relay_Log_File: mysqld-relay-bin.000495
                Relay_Log_Pos: 379239275
        Relay_Master_Log_File: mysql-bin.000167
             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: 1051
                   Last_Error: Error 'Unknown table 'ptle_pep'' on query. Default database: 'pottts'. Query: 'DROP TABLE `ptle_pep`'
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 379239130
              Relay_Log_Space: 411337070
              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: 0
                Last_IO_Error:
               Last_SQL_Errno: 1051
               Last_SQL_Error: Error 'Unknown table 'ptle_pep'' on query. Default database: 'pottts'. Query: 'DROP TABLE `ptle_pep`'
1 row in set (0.00 sec)

En este caso vemos que no se puede ejecutar un DROP TABLE porque no existe en el slave pero si estaba en el master. Para saltarnos esta query usaremos set global sql_slave_skip_counter:

mysql> set global sql_slave_skip_counter=1;
Query OK, 0 rows affected (0.00 sec)

mysql> start slave;
Query OK, 0 rows affected (0.00 sec)

Una vez saltada la query veremos como la replicación continua si no nos encontramos con otro error:

mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 10.1.5.1
                  Master_User: slave
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000167
          Read_Master_Log_Pos: 411562659
               Relay_Log_File: mysqld-relay-bin.000495
                Relay_Log_Pos: 380625869
        Relay_Master_Log_File: mysql-bin.000167
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB:
          Replicate_Ignore_DB:
           Replicate_Do_Table:
       Replicate_Ignore_Table:
      Replicate_Wild_Do_Table:
  Replicate_Wild_Ignore_Table:
                   Last_Errno: 0
                   Last_Error:
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 380625724
              Relay_Log_Space: 411563605
              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: 2870
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error:
               Last_SQL_Errno: 0
               Last_SQL_Error:
1 row in set (0.01 sec)

mysql>

En este caso, al ser un DROP que se podía ejecutar en el slave, simple sólo hemos tenido que saltarnos la query que daba problemas, pero en otros casos deberemos assegurarnos que una vez nos saltemos la query problemática los datos del master y el slave son iguales.

Deja un comentario:

XHTML - Tags permitidos:<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>