Vamos a forzar un fallo en la replicación creando una base de datos en el servidor esclavo y posteriormente crearla en el maestro. La forma natural de que el esclavo tuviera esa base de datos sería heredandola del maestro, no creándose de forma manual. Esto provocará el fallo de la replicación:
mysql-esclavo> CREATE DATABASE prueba;
mysql-master> CREATE DATABASE prueba;
Una vez realizado esto, el master replicará la creación de esa base de datos en el esclavo, pero como la hemos creado a mano provocará el fallo y que se pare la replicación, lo podemos ver al hacer un SHOW SLAVE STATUS en el esclavo:
mysql> SHOW SLAVE STATUS\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.1.129
Master_User: replicacion
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysqld-bin.000004
Read_Master_Log_Pos: 179
Relay_Log_File: mysqld-relay-bin.000008
Relay_Log_Pos: 236
Relay_Master_Log_File: mysqld-bin.000004
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: 1007
Last_Error: Error 'Can't create database 'prueba'; database exists' on query. Default database: 'prueba'. Query: 'create database prueba'
Skip_Counter: 0
Exec_Master_Log_Pos: 98
Relay_Log_Space: 317
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)
Sabemos que el error se encuentra en la consulta SQL de creación de la base de datos «prueba». Gracias a la opción SET GLOBAL SQL_SLAVE_SKIP_COUNTER podemos decirle al servidor esclavo que se salte X posiciones del log binario para así evitar las consultas problemáticas:
mysql-esclavo>SET GLOBAL SQL_SLAVE_SKIP_COUNTER =1;
Con el comando anterior hemos saltado la consulta de creación de la base de datos «prueba», ahora podemos reiniciar la replicación en el esclavo y verificar si ya no tenemos errores y vuelve a la normalidad:
mysql-esclavo> START SLAVE;
Query OK, 0 rows affected (0.01 sec)
mysql-esclavo> SHOW SLAVE STATUS\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.1.129
Master_User: replicacion
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysqld-bin.000004
Read_Master_Log_Pos: 179
Relay_Log_File: mysqld-relay-bin.000008
Relay_Log_Pos: 317
Relay_Master_Log_File: mysqld-bin.000004
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: 179
Relay_Log_Space: 317
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: 0
1 row in set (0.00 sec)
Efectivamente, todo ha vuelto a la normalidad. Si siguiera pasando habría que revisar la opción de seguir saltando consultas del log. Lo importante cuando hacemos esto es mantener los mismos datos en el maestro y el esclavo, ya que en este caso sabemos que simplemente era por la prueba de crear la base de datos, pero en cuestión de consultas INSERT, DROP, etc la cosa puede no ser tan sencilla.