Hace unos días vimos como crear una replicación MySQL maestro-esclavo paso a paso. Ahora vamos a empezar a ver la forma de arreglar los errores más comunes en este tipo de replicaciones. En esta entrada concretamente aquel provocado cuando una acción realizada en el master no se puede replicar al esclavo por el motivo que sea.
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.
Respecto al tema que comento al final sobre la consistencia de datos entre Master y Slave ante un fallo de este tipo, os recomiendo revisar este artículo de Miguel Ángel Nieto:
http://miguelangelnieto.net/?action=view&url=mantener-la-consistencia-de-los-datos-en-la-replicaci%C3%B3n
Gracias, me ha servido de mucho. No se que me pasa que el server -que es un viejo cacharro que uso para hacer pruebas- se me congela y tengo que reiniciarlo, lo que suele conllevar este error. Estoy por hacer un script que lo corrija automáticamente :-D
Hola que tal, ya realice toda la configuración necesaria que se necesita para la replicación. Pero la replica no se realiza. Al ejecutar el SHOW SLAVE STATUS me muestra este mensaje Fatal error: The slave I/O theread stops because master and slave have equal MySQL server UUIDs; these UUIDs must be different for replication to work. Si me pudieran ayudar con este error se los agradeciera mucho…
Cambia el UUID del esclavo.